C#通過DataGridView對數據庫進行增刪改查

運行效果.png
一、準備數據庫Student,數據表TableStudent
CREATE TABLE [dbo].[TableStudent] (
    [stuId]        INT           IDENTITY (1, 1) NOT NULL,
    [stuName]      NVARCHAR (32) NULL,
    [stuSex]       NCHAR (2)     NULL,
    [stuBirthdate] NVARCHAR (32) NULL,
    [stuPhone]     NVARCHAR (32) NULL,
    PRIMARY KEY CLUSTERED ([stuId] ASC)
);
二、獲取數據庫連接字符串
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;

namespace DataAdapterExample
{
    class sqlHelper
    {

        //獲取數據庫連接字符串
        public static string GetConnectionString()
        {
            return ConfigurationManager.ConnectionStrings["strConnect"].ConnectionString;
        }

        #region 封裝一個執行SQL返回受影響的行數
        public static int ExecuteNoQuery(string sqlText,params SqlParameter[] parameters)
        {
            using (SqlConnection con = new SqlConnection(GetConnectionString()))
            {
                using (SqlCommand cmd = con.CreateCommand())
                {
                    con.Open();
                    cmd.CommandText = sqlText;
                    cmd.Parameters.AddRange(parameters.ToArray());
                    return cmd.ExecuteNonQuery();
                }
            }
        }
        #endregion

        #region 封裝一個執行SQL返回查詢結果中第一行第一列的值
        public static object ExecuteScalar(string sqlText,params SqlParameter[] parameters)
        {
            using (SqlConnection con = new SqlConnection(GetConnectionString()))
            {
                using (SqlCommand cmd = con.CreateCommand())
                {
                    con.Open();
                    cmd.CommandText = sqlText;
                    cmd.Parameters.AddRange(parameters.ToArray());
                    return cmd.ExecuteScalar();
                }
            }
        }
        #endregion

        #region 封裝一個執行SQL返回一個DataTable
        public static DataTable ExecuteDataTable(string sqlText,params SqlParameter[] parameters)
        {
            using (SqlDataAdapter adapter = new SqlDataAdapter(sqlText,GetConnectionString()))
            {
                
                DataTable dt = new DataTable();
                adapter.SelectCommand.Parameters.AddRange(parameters.ToArray());
                adapter.Fill(dt);
                return dt;
            }
        }
        #endregion

        #region 封裝一個執行SQL返回一個SqlDataReader
        public static SqlDataReader ExecutedReader(string sqlText,params SqlParameter[] parameters)
        {
            //SqlDataReader要求獨占SqlConnection對象,并且SqlConnection必須是Open狀態
            SqlConnection con = new SqlConnection(GetConnectionString());
            con.Open();
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandText = sqlText;
            cmd.Parameters.AddRange(parameters.ToArray());
            //SqlDataReader執行完成后順便關閉數據庫連接
            return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }
        #endregion
    }
}

三、數據表映射StudentInfo幫助類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataAdapterExample
{
    public class StudentInfo
    {
        public int stuId { get; set; }
        public string stuName { get; set; }
        public string stuSex { get; set; }
        public string stuBirthdate { get; set; }
        public string stuPhone { get; set; }
    }
}
四、主窗體對數據表進行CURD
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Configuration;
using System.Data.SqlClient;

namespace DataAdapterExample
{
    public partial class MainFrm : Form
    {
        //標識正在修改的數據行的主鍵
        private int updateStudentId = 0;
        public MainFrm()
        {
            InitializeComponent();
        }

        //主窗體加載數據
        private void MainFrm_Load(object sender, EventArgs e)
        {
            LoadStudentInfo();
        }
        //增加數據
        private void ButtonAdd_Click(object sender, EventArgs e)
        {
            using (SqlConnection con = new SqlConnection(sqlHelper.GetConnectionString()))
            {
                con.Open();
                using (SqlCommand cmd = con.CreateCommand())
                {
                    cmd.CommandText = "insert into TableStudent (stuName,stuPhone,stuBirthdate,stuSex) values (@stuName,@stuPhone,@stuBirthdate,@stuSex)";
                    cmd.Parameters.AddWithValue("@stuName", this.textBoxstuName.Text.Trim());
                    cmd.Parameters.AddWithValue("@stuPhone", this.textBoxstuPhone.Text.Trim());
                    cmd.Parameters.AddWithValue("@stuSex", this.textBoxstuSex.Text.Trim());
                    cmd.Parameters.AddWithValue("@stuBirthdate", this.textBoxstuBirthdate.Text.Trim());
                    if (cmd.ExecuteNonQuery() > 0)
                    {
                        MessageBox.Show("增加數據成功!");
                    }

                }
            }
            LoadStudentInfo();
        }

        //刪除數據
        private void ButtonDelete_Click(object sender, EventArgs e)
        {
            if (this.dataGridViewFromAdapter.SelectedRows.Count <= 0)
            {
                MessageBox.Show("請選擇要刪除的數據");
            }
            if (MessageBox.Show("確認要刪除嗎?", "提醒消息", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes)
            {
                return;
            }
            int deleteStuId = int.Parse(this.dataGridViewFromAdapter.SelectedRows[0].Cells["stuId"].Value.ToString());

            #region 原生手寫
            //using (SqlConnection con = new SqlConnection(sqlHelper.GetConnectionString()))
            //{
            //    con.Open();
            //    string sql = "delete from TableStudent where stuId=@stuId";
            //    using (SqlCommand cmd = con.CreateCommand())
            //    {
            //        cmd.CommandText = sql;
            //        cmd.Parameters.AddWithValue("stuId", deleteStuId);

            //        //cmd.Parameters.Add("@stuId", SqlDbType.Int);
            //        //cmd.Parameters["stuId"].Value = deleteStuId;

            //        //SqlParameter parameter = new SqlParameter();
            //        //parameter.ParameterName = "@stuId";
            //        //parameter.Value = deleteStuId;
            //        //cmd.Parameters.Add(parameter);


            //        if (cmd.ExecuteNonQuery() > 0)
            //        {
            //            MessageBox.Show("刪除成功");
            //        }
            //    }
            //} 
            #endregion
            #region sqlHelper封裝方法ExecuteNoQuery
            string strSQL = "delete from TableStudent where stuId=@stuId";
            int num = sqlHelper.ExecuteNoQuery(strSQL, new SqlParameter("@stuId", (object)deleteStuId));
            if (num>0)
            {
                MessageBox.Show("刪除成功");
            }
            #endregion
            LoadStudentInfo();
        }

        //修改數據
        private void buttonUpdate_Click(object sender, EventArgs e)
        {
            using (SqlConnection con = new SqlConnection(sqlHelper.GetConnectionString()))
            {
                using (SqlCommand cmd = con.CreateCommand())
                {
                    con.Open();
                    cmd.CommandText = "update TableStudent set stuName=@stuName,stuSex=@stuSex,stuBirthdate=@stuBirthdate,stuPhone=@stuPhone where stuId=@stuId";
                    cmd.Parameters.AddWithValue("@stuName", this.textBoxstuName.Text);
                    cmd.Parameters.AddWithValue("@stuBirthdate", this.textBoxstuBirthdate.Text);
                    cmd.Parameters.AddWithValue("@stuSex", this.textBoxstuSex.Text);
                    cmd.Parameters.AddWithValue("@stuPhone", this.textBoxstuPhone.Text);
                    cmd.Parameters.AddWithValue("@stuId", this.updateStudentId);
                    if (cmd.ExecuteNonQuery() > 0)
                    {
                        MessageBox.Show("更新數據成功");
                    }
                }
            }
            //刷新數據
            ButtonSearch_Click(this,null);
        }

        //選中數據賦值到對應文本框
        private void dataGridViewFromAdapter_SelectionChanged(object sender, EventArgs e)
        {
            if (this.dataGridViewFromAdapter.SelectedRows.Count <= 0)
            {
                //MessageBox.Show("請先選中數據");
                return;
            }
            //選中行的Id
            int selectedId = int.Parse(this.dataGridViewFromAdapter.SelectedRows[0].Cells["stuId"].Value.ToString());
            //把要修改的數據行的ID放到當前窗體的updateStudentId字段中保存
            updateStudentId = selectedId;
            using (SqlConnection con = new SqlConnection(sqlHelper.GetConnectionString()))
            {
                con.Open();

                using (SqlCommand cmd = con.CreateCommand())
                {
                    cmd.CommandText = "select stuId,stuName,stuSex,stuBirthdate,stuPhone from TableStudent where stuId=@stuId";
                    cmd.Parameters.AddWithValue("@stuId", selectedId);
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            this.textBoxstuSex.Text = reader["stuSex"].ToString().Trim();
                            this.textBoxstuName.Text = reader["stuName"].ToString().Trim();
                            this.textBoxstuBirthdate.Text = reader["stuBirthdate"].ToString().Trim();
                            this.textBoxstuPhone.Text = reader["stuPhone"].ToString().Trim();
                        }
                    }
                }
            }
        }

        //雙擊彈出修改窗體
        private void dataGridViewFromAdapter_DoubleClick(object sender, EventArgs e)
        {
            if (this.dataGridViewFromAdapter.SelectedRows.Count <= 0)
            {
                return;
            }
            int editStuId = int.Parse(this.dataGridViewFromAdapter.SelectedRows[0].Cells["stuId"].Value.ToString());
            EditStudentForm editStuFrm = new EditStudentForm(new StudentInfo() { stuId = editStuId });
            //注冊彈出窗體的關閉事件
            editStuFrm.FormClosing += EditStuFrm_FormClosing;
            editStuFrm.Show();
        }


        //彈出窗體修改完成關閉的時候執行的操作
        private void EditStuFrm_FormClosing(object sender, FormClosingEventArgs e)
        {
            LoadStudentInfo();
        }

        //多條件查詢
        private void ButtonSearch_Click(object sender, EventArgs e)
        {

            //拼接whereSqlText腳本
            string whereSqlText = "select stuId,stuName,stuPhone,stuBirthdate,stuSex from TableStudent";
            List<string> whereList = new List<string>();
            List<SqlParameter> parameters = new List<SqlParameter>();
            if (!string.IsNullOrEmpty(this.textBoxSearchName.Text.Trim()))
            {
                //把where條件添加到whereList集合中
                whereList.Add("stuName like @stuName");
                SqlParameter parameter = new SqlParameter();
                parameter.ParameterName = "@stuName";
                parameter.Value = "%" + this.textBoxSearchName.Text.Trim() + "%";
                parameters.Add(parameter);
            }
            if (!string.IsNullOrEmpty(this.textBoxSearchSex.Text.Trim()))
            {
                //把where條件添加到whereList集合中
                whereList.Add("stuSex like @stuSex");
                SqlParameter parameter = new SqlParameter();
                parameter.ParameterName = "@stuSex";
                parameter.Value = "%" + this.textBoxSearchSex.Text.Trim() + "%";
                parameters.Add(parameter);

            }
            if (whereList.Count > 0)
            {
                whereSqlText += " where " + string.Join(" and ", whereList);
                //MessageBox.Show(whereSqlText);
                
            }
            //加載數據方法的調用
            LoadStudentInfo2DataGridView(whereSqlText, parameters.ToArray());
            
        }

        //加載數據
        private void LoadStudentInfo()
        {
            List<StudentInfo> studentInfoList = new List<StudentInfo>();
            string sqlText = "select stuId,stuName,stuSex,stuBirthdate,stuPhone from TableStudent";
            LoadStudentInfo2DataGridView(sqlText);
        }

        //加載數據方法的封裝
        public void LoadStudentInfo2DataGridView(string sqlText,params SqlParameter[] parameters)
        {
            List<StudentInfo> studentInfoList = new List<StudentInfo>();
            #region 原生寫法
            //using (SqlConnection con = new SqlConnection(sqlHelper.GetConnectionString()))
            //{
            //    using (SqlDataAdapter adapter = new SqlDataAdapter(sqlText, con))
            //    {
            //        //填充之前,給SelectCommand賦參數
            //        adapter.SelectCommand.Parameters.AddRange(parameters.ToArray());
            //        DataTable dt = new DataTable();
            //        adapter.Fill(dt);
            //        foreach (DataRow row in dt.Rows)
            //        {
            //            StudentInfo studentInfo = new StudentInfo();
            //            studentInfo.stuId = int.Parse(row["stuId"].ToString().Trim());
            //            studentInfo.stuName = row["stuName"].ToString().Trim();
            //            studentInfo.stuSex = row["stuSex"].ToString().Trim();
            //            studentInfo.stuBirthdate = row["stuBirthdate"].ToString().Trim();
            //            studentInfo.stuPhone = row["stuPhone"].ToString().Trim();
            //            studentInfoList.Add(studentInfo);
            //        }

            //        this.dataGridViewFromAdapter.DataSource = studentInfoList;
            //    }
            //}
            #endregion

            #region sqlHelper類的ExecuteDataTable方法
            DataTable dt = sqlHelper.ExecuteDataTable(sqlText, parameters);
            foreach (DataRow row in dt.Rows)
            {
                StudentInfo studentInfo = new StudentInfo();
                studentInfo.stuId = int.Parse(row["stuId"].ToString().Trim());
                studentInfo.stuName = row["stuName"].ToString().Trim();
                studentInfo.stuSex = row["stuSex"].ToString().Trim();
                studentInfo.stuBirthdate = row["stuBirthdate"].ToString().Trim();
                studentInfo.stuPhone = row["stuPhone"].ToString().Trim();
                studentInfoList.Add(studentInfo);
            }

            this.dataGridViewFromAdapter.DataSource = studentInfoList;
            #endregion
        }


    }
}

五、雙擊DataGridView選中行彈出子窗體EditStudentForm對數據可以進行修改
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace DataAdapterExample
{
    public partial class EditStudentForm : Form
    {
        //窗體屬性
        public StudentInfo StuInfo { get; set; }

        //構造函數接收StudentInfo對象
        public EditStudentForm(StudentInfo stuInfo)
        {
            InitializeComponent();
            //將傳遞的對象賦值給當前對象的屬性
            StuInfo = stuInfo;
        }

        //彈出窗體的時候加載傳遞行stuId對應的數據到對應文本框
        private void EditStudentForm_Load(object sender, EventArgs e)
        {
            #region 原生寫法
            //using (SqlConnection con = new SqlConnection(sqlHelper.GetConnectionString()))
            //{

            //    using (SqlCommand cmd = con.CreateCommand())
            //    {
            //        con.Open();
            //        cmd.CommandText = "select stuSex,stuName,stuBirthdate,stuPhone from TableStudent where stuId=@stuId";
            //        cmd.Parameters.AddWithValue("@stuId", StuInfo.stuId);
            //        using (SqlDataReader reader = cmd.ExecuteReader())
            //        {
            //            if (reader.Read())
            //            {
            //                this.textBoxstuBirthdate.Text = reader["stuBirthdate"].ToString().Trim();
            //                this.textBoxstuName.Text = reader["stuName"].ToString().Trim();
            //                this.textBoxstuPhone.Text = reader["stuPhone"].ToString().Trim();
            //                this.textBoxstuSex.Text = reader["stuSex"].ToString().Trim();
            //            }
            //        }
            //    }

            //} 
            #endregion

            #region sqlHelper類的ExecuteReader方法
            string strSQL = "select stuSex,stuName,stuBirthdate,stuPhone from TableStudent where stuId=@stuId";
            using (SqlDataReader reader = sqlHelper.ExecutedReader(strSQL, new SqlParameter("@stuId", (object)StuInfo.stuId)))
            {

                if (reader.Read())
                {
                    this.textBoxstuBirthdate.Text = reader["stuBirthdate"].ToString().Trim();
                    this.textBoxstuName.Text = reader["stuName"].ToString().Trim();
                    this.textBoxstuPhone.Text = reader["stuPhone"].ToString().Trim();
                    this.textBoxstuSex.Text = reader["stuSex"].ToString().Trim();
                }
            } 
            #endregion
        }

        //保存更新
        private void ButtonSave_Click(object sender, EventArgs e)
        {
            #region 原生寫法
            //using (SqlConnection con = new SqlConnection(sqlHelper.GetConnectionString()))
            //{
            //    using (SqlCommand cmd = con.CreateCommand())
            //    {
            //        con.Open();
            //        cmd.CommandText = "update TableStudent set stuPhone=@stuPhone,stuName=@stuName,stuBirthdate=@stuBirthdate,stuSex=@stuSex where stuId=@stuId";
            //        cmd.Parameters.AddWithValue("@stuId", StuInfo.stuId);
            //        cmd.Parameters.AddWithValue("@stuName", this.textBoxstuName.Text.Trim());
            //        cmd.Parameters.AddWithValue("@stuBirthdate", this.textBoxstuBirthdate.Text.Trim());
            //        cmd.Parameters.AddWithValue("@stuPhone", this.textBoxstuPhone.Text.Trim());
            //        cmd.Parameters.AddWithValue("@stuSex", this.textBoxstuSex.Text.Trim());
            //        if (cmd.ExecuteNonQuery() > 0)
            //        {
            //            MessageBox.Show("更新成功");
            //        }
            //        //關閉窗體
            //        this.Close();
            //    }
            //} 
            #endregion
            
            #region 使用sqlHelper類的ExecuteNoQuery靜態方法
            string strSQL = "update TableStudent set stuPhone=@stuPhone,stuName=@stuName,stuBirthdate=@stuBirthdate,stuSex=@stuSex where stuId=@stuId";
            List<SqlParameter> parameterList = new List<SqlParameter>();

            SqlParameter paraStuName = new SqlParameter("@stuName", SqlDbType.NVarChar, 32);
            paraStuName.Value = this.textBoxstuName.Text.Trim();
            parameterList.Add(paraStuName);

            SqlParameter paraStuSex = new SqlParameter("@stuSex", SqlDbType.NVarChar, 32);
            paraStuSex.Value = this.textBoxstuSex.Text.Trim();
            parameterList.Add(paraStuSex);

            SqlParameter paraStuBirthdate = new SqlParameter("@stuBirthdate", SqlDbType.NVarChar, 32);
            paraStuBirthdate.Value = this.textBoxstuBirthdate.Text.Trim();
            parameterList.Add(paraStuBirthdate);

            SqlParameter paraStuPhone = new SqlParameter("@stuPhone", SqlDbType.NVarChar, 32);
            paraStuPhone.Value = this.textBoxstuPhone.Text.Trim();
            parameterList.Add(paraStuPhone);

            SqlParameter paraStuId = new SqlParameter("@stuId", SqlDbType.NVarChar, 32);
            paraStuId.Value = StuInfo.stuId;
            parameterList.Add(paraStuId);

            int num = sqlHelper.ExecuteNoQuery(strSQL, parameterList.ToArray());
            if (num > 0)
            {
                MessageBox.Show("保存更新成功!");
            }
            //關閉窗口
            this.Close(); 
            #endregion
        }

    }
}

主窗體最下面的文本框功能:

(1)增加新的數據行
(2)顯示選中行數據
(3)修改選中行數據

優化:sqlHelper類中封裝方法

(1)執行SQL返回受影響的行數的ExecuteNoQuery方法
(2)執行SQL返回查詢結果中第一行第一列的值的ExecuteScalar方法
(3)執行SQL返回一個DataTable的ExecuteDataTable方法
(4)執行SQL返回一個SqlDataReader的ExecutedReader方法

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容