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方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容