[MrYoung教程:易学之道]3ADO.NET基础之数据的增修删查

一、前文回顾

上文中我们以一个数据的展示窗体像大家介绍了SQLDATAADAPTER,DATASET的基本使用,他是我们内存中的缓存数据集合,并介绍了如何绑定数据到我们的窗体控件和如何获取DATAGRIDVIEW当中的指定单元格的值。

二、概述

本文中我们将关注如何以拼接字符串的方式实现数据的增,修,删,查,并引出SQL注入的基本原理。 本文配套视频 优酷专辑地址:http://www.youku.com/playlist_show/id_6080910.html

本集地址:http://v.youku.com/v_playlist/f6080910o1p2.html

三、主要内容

3.1 数据的增,修,删
3.2 LIKE操作符及记录查询
3.3 SQL注入原理

四、数据的增,修,删

首先在我们的frmMain窗体中拖入如下控件并改名:
[MrYoung教程:易学之道]3ADO.NET基础之数据的增修删查
4.1 新增记录:我们首先来实现数据的新增,但用户在上述的文本框中填入正确的姓名,密码,年龄等信息后,点击新增按钮,我们把数据存入数据库中。主要是获取各个文本框的值,然后拼接成正确的SQL语句,如insert into tb_user values('姓名','密码','年龄'.......),然后调用SQL语句执行,具体代码如下:
private void btn新增_Click(object sender, EventArgs e) { //sql字符串拼接成最后的插入语句 string sql = "insert into tb_user (username,userpassword,userage,userphone,useraddress)" +"values('"+txtUserName.Text+"','"+txtPWD.Text+"',"+txtAge.Text+",'"+txtPhone.Text+"','"+txtAddress.Text+"')"; //调用数据库操作方法执行语句 BaseClass.BaseOperate.getcom(sql); //弹出对话框提示用户操作成功 MessageBox.Show("新增用户成功!"); //重新执行查询并绑定数据窗体已显示新增的内容,相当于刷新数据窗体 ds = BaseClass.BaseOperate.getds("select id as 编号,username as 姓名,userpassword as 密码,userage as 年龄,userphone as 电话,useraddress as 地址 from tb_user"); dataGridView1.DataSource = ds.Tables[0]; //情况各输入框的值 reset(); //使光标停在第一个ID输入框中 txtID.Focus(); } void reset() { txtAddress.Text = ""; txtAge.Text = ""; txtID.Text = ""; txtPhone.Text = ""; txtPWD.Text = ""; txtUserName.Text = ""; }

BaseOperate中的getcom方法如下,用于执行插入,修改,删除操作:
/// /// 执行SQLCOMMAND命令 /// /// 要执行的SQL语句
public static void getcom(string str_sql) { using (SqlConnection sqlcon = new SqlConnection(connectionString)) { using (SqlCommand sqlcom = new SqlCommand(str_sql, sqlcon)) { try { sqlcon.Open(); sqlcom.ExecuteNonQuery(); } catch (Exception e1) { sqlcon.Close(); throw new Exception(e1.Message); } } } }

4.2 修改,删除方法相似,均为取得用户在dataGridView1中选取行的ID信息,通过ID(因为ID为数据库中每条记录的唯一标识)去操作数据库中的具体行数据。

private void btn修改_Click(object sender, EventArgs e) { //获取用户选择行的用户名 string strname = Convert.ToString(dataGridView1[1,dataGridView1.CurrentCell.RowIndex].Value); //弹出对话框提示用户是否要修改信息,如果用户点击确定则执行修改操作 if (MessageBox.Show("你确定要修改" + strname + "用户么?","提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK) { string sql = "update tb_user set username='" + txtUserName.Text + "',userpassword='" + txtPWD.Text + "',userage=" + txtAge.Text + ",userphone='" + txtPhone.Text + "',useraddress='" + txtAddress.Text + "' where id=" + Convert.ToString(dataGridView1[0, dataGridView1.CurrentCell.RowIndex].Value); BaseClass.BaseOperate.getcom(sql); MessageBox.Show("修改用户成功!"); ds = BaseClass.BaseOperate.getds("select id as 编号,username as 姓名,userpassword as 密码,userage as 年龄,userphone as 电话,useraddress as 地址 from tb_user"); dataGridView1.DataSource = ds.Tables[0]; reset(); txtID.Focus(); } }

private void btn删除_Click(object sender, EventArgs e) { string strname = Convert.ToString(dataGridView1[1, dataGridView1.CurrentCell.RowIndex].Value); if (MessageBox.Show("你确定要删除" + strname + "用户么?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK) { string sql = "delete from tb_user where id=" + Convert.ToString(dataGridView1[0, dataGridView1.CurrentCell.RowIndex].Value); BaseClass.BaseOperate.getcom(sql); MessageBox.Show("删除用户成功!"); ds = BaseClass.BaseOperate.getds("select id as 编号,username as 姓名,userpassword as 密码,userage as 年龄,userphone as 电话,useraddress as 地址 from tb_user"); dataGridView1.DataSource = ds.Tables[0]; reset(); txtID.Focus(); } }

五、LIKE操作符及记录查询

5.1 SQL 中的LIKE操作符:% 包含零个或更多字符的任意字符串。 _(下划线)任何单个字符。 [ ] 指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。 [^] 不属于指定范围。示例:
select * from tb_user where username like '%young' select * from tb_user where username like '_r%' select * from tb_user where username like '[l-n]m_ong' select * from tb_user where username like '[mnc]%'

第一条SQL语句代表查询username列中所有以young结尾,前面有0个或多个字符的记录。
第二条SQL语句代表查询username列中任何单个字符开头,第二个字符为r,以0个或多个任意字符结尾的记录。
第三条SQL语句代表查询username列中第一个字符在范围l到n之间,也就是l,m,n中的一个,第二个字符为m第三个字符为任意字符,以org结尾的记录。
第四条SQL语句代表查询username列中第一个字符为m,n,c中的一个,后可为0个或多个字符的记录。
5.2 数据查询示例: 通过LIKE 我们可以在程序中实现查询,但用户输入一个关键字后,我们用like关键字在数据库中取查询包含此关键字的记录并展示出来。在frmMain窗体中我们添加一个下拉框comboBox1,一个文本框txt关键字,一个按钮btn查询,在按钮的查询语句中代码如下:
private void btn查询_Click(object sender, EventArgs e) { string sql; ds = new DataSet(); //输入为空时 if (txt关键字.Text.Trim() == "") { MessageBox.Show("请输入关键字!"); txt关键字.Focus(); }else { if (comboBox1.Text == "用户名") { //拼接字符串,用LIKE查询以0或多个字符开始,包含txt关键字的内容,以0或多个 字符结尾的记录 sql = "select * from tb_user where username like '%" + txt关键 字.Text.Trim() + "%'"; ds = BaseClass.BaseOperate.getds(sql); if (ds.Tables[0].Rows.Count == 0) { MessageBox.Show("未查询到任何相关记录!"); } else { dataGridView1.DataSource = ds.Tables[0]; } } } }

六、SQL注入

运行我们的程序,在登陆窗体的密码中输入' or 1=1-- ,会发现我们可以正常登陆跳转到主窗体,而这个并不是我们正确的密码,来看看他提交的SQL语句。
select * from tb_user where username='mryoung' and userpassword='' or 1=1--'

在SQL SERVER中 or代表或,上面的SQL语句中WHERE后的两个条件username='mryoung' and userpassword='' 和 1=1只要一个为真,整个SQL语句就成立,而1=1为恒等式,本来最后还应该有个单引号的,但我们输入了双斜杠--,他在SQL中为注释的意思,表示应该忽略其后的所有内容,这样,非法用户就成功登陆到我们的系统当中。
这就是臭名昭著的SQL注入攻击,这个例子充分证明了我们的程序是经不起考验的,拼接字符串的方式是不安全的,在下文中我们将重写所有的方法,改用参数化查询来代替字符串拼接的方式,敬请期待。

七、其他信息 本文章内容对应视频教程的第三讲[MrYoung教程:易学之道]3ADO.NET基础之数据的增修删查,在文首我已经给出了优酷的链接,建议家先观看视频,然后再来看本文会更加清晰,若有不明白的的地方,当然你也可以给我留言或加入QQ群13615607交流,在群里有本文的视频教程,PPT,源码供下载。
帮助QQ群:13615607,请注明来自博客园
本文配套视频 优酷专辑地址:http://www.youku.com/playlist_show/id_6080910.html
本集地址:http://v.youku.com/v_playlist/f6080910o1p2.html

八、本系列已有教程

8.1 [MrYoung教程:易学之道]1ADONET基础及登录模块的实现 1-1
8.2 [MrYoung教程:易学之道]1ADONET基础及登录模块的实现 1-2
8.3 [MrYoung教程:易学之道]2ADONET基础之数据展现
Tags: 

延伸阅读

最新评论

发表评论