vs中C#语言datagridview控件与sqlserver数据库数据增删改操作实现

时间:2022-10-30 14:44:09

c#中直接使用datagridview与自己的数据库中的数据进行增删改查的操作互动

(以对数据库增加记录为例说明) 

1.直接写入法利用CommandText

 程序如下:

conn.Open();

 SqlCommand cmd = new SqlCommand();

 cmd.Connection = conn;

//注意这里的insert语句中的单双引号使用。双引号使用在字符串上,数字型不使用引号,单引号是由于外面括号有了双引号

//换行使用“+”用于连接

  cmd.CommandText = "InsertList1(Name,Sex)Values('" + textBox1.Text +"','" + textBox2.Text + "')";

//执行cmd命令

  cmd.ExecuteNonQuery();

 DataSet dslist = new DataSet();

 SqlDataAdapter dalist = new SqlDataAdapter("Select * From List1", conn);

 dalist.Fill(dslist, "List1");

dataGridView1.DataSource =dslist.Tables["List1"];

conn.Close();

 2、给命令对象添加参数法:利用SqlParameter

程序如下:

conn.Open();

SqlCommand command = new SqlCommand("InsertList1(Name, Sex) " +

"Values(@Name,@Sex)",conn);

command.Connection = conn;

//添加参数

SqlParameter para = new SqlParameter("@Name",SqlDbType.VarChar, 50);

  para.Value = textBox1.Text;

command.Parameters.Add(para);

//添加参数

SqlParameter para1 = new SqlParameter("@Sex",SqlDbType.VarChar, 50);

para1.Value = textBox2.Text;

command.Parameters.Add(para1);

//执行cmd命令

command.ExecuteNonQuery();

DataSet dslist = new DataSet();

SqlDataAdapter dalist = new SqlDataAdapter("Select * FromList1",conn);

dalist.Fill(dslist, "List1");

dataGridView1.DataSource =dslist.Tables["List1"];

conn.Close();

分析:

@Id的参数,必须以@开头表示是添加的参数,并设置其类型长度,类型长度与数据库中对应字段相同

以上程序只是说明两种方法的用法,对于这两种方法优劣分析见一下网址:

http://www.cnblogs.com/sjrhero/articles/1865220.html

(以下文字为原文)

SqlParameter用法:

关于Sql注入的基本概念,相信不需多说,大家都清楚,经典的注入语句是' or 1=1--

单引号而截断字符串,“or 1=1”的永真式的出现使得表的一些信息被暴露出来,如果sql语句是select * from 的话,可能你整个表的信息都会被读取到,

更严重的是,如果恶意使用都使用drop命令,那么可能你的整个数据库得全线崩溃。 

当然,现在重点不是讲sql注入的害处,而是说说如何最大限度的避免注入问题。

sql注入的存在在最大危害,是sql的执行语句没有和控制语句分开,我们想要select一些东西,但用户可能拼出' or 1=1甚至再加上delete/update/drop,后来是属于控制语句了,所以要避免sql的注入,就必须把查询语句与控制语句分开。

SqlParameter给我们提供了一个很好的类,有了它,我们可以不现拼接字符串,也可以不再担心单引号带来的惨剧,因为,这一切会有人来为我们完成的。

简单的给个示例

传统的查询语句

  string sql = "select * from users where user_id='" +Request.QueryString["uid"] +"'";

很显然,我们在这里拼接了字符串,这就给sql注入留下了可乘之机。

现在,我们要改写这样的语句,使用SqlParameter来做

SqlCommand SqlCmd = new SqlCommand(sql, SqlConn);

  SqlParameter _userid = new SqlParameter("uid",SqlDbType.Int);

  _userid.Value = Request.QueryString["u_id"];

  SqlCmd.Parameters.Add(_userid);

这样,我们可以保证外接参数能被正确的转换,单引号这些危险的字符也会转义了,不会再对库造成威胁。

当然,这仅是一个示例而已,在真实的情况下,可能你还要对 Request.QueryString["u_id"]进行必要的检测与分析,这样才安全

所以,使用参数化的sql语句,是一种很好的做法

上面的内容是别人的总结,我自己在试验的时候对datagridview的增删改查是结合上述两种方法进行实现的,以下是关键的更新操作代码

更新操作:

  try
            {
                conn.Open();
                //
                //如果报错:未将对象引用到对象实例
                //错误原因:我们要使用的数据是null的
                //错误纠正:检查使用的对象是不是写对了,例如row引用的表table-list2是否存在
                //
                //
                SqlCommand command= new SqlCommand("Update List2 set Name=@Name,Sex=@Sex " +
        "WHERE Name = @oldName", conn);
                command.Connection = conn;
                #region
                //添加参数0
                SqlParameter para = new SqlParameter("@Name", SqlDbType.VarChar, 50);
                para.Value = dataGridView1.Rows[Y].Cells[0].Value.ToString();
                command.Parameters.Add(para);
                //添加参数1
                SqlParameter para1 = new SqlParameter("@Sex", SqlDbType.VarChar, 50);
                para1.Value = dataGridView1.Rows[Y].Cells[1].Value.ToString();
                command.Parameters.Add(para1);
                //添加参数2
                SqlParameter para2 = new SqlParameter("@oldName", SqlDbType.VarChar, 50);
                DataRow dr = dslist.Tables["List2"].Rows[Y];
                para2.Value = dr[0, DataRowVersion.Original];
                command.Parameters.Add(para2);
                #endregion
                //
                //第二部分
                //
                command.ExecuteNonQuery();
                //
                //
                dslist.Clear();
                dalist = new SqlDataAdapter("Select * From List2", conn);
                dalist.Fill(dslist, "List2");
                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString() + "打开数据库失败!");
            }

 这里的Y获取代码:给datagridview添加监听器

   private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            textBox1.Text = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();
            textBox2.Text = dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString();
            Y = e.RowIndex;
        }