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;
}