[MrYoung教程:易学之道]4ADONET基础之参数化查询
2011-05-31 22:59 [MrYoung] 阅读(1734) 评论(2) 收藏 举报一、前文回顾
上文中我们讲解了数据库的增,修,删,查操作,并以一个例子引出了臭名昭著的SQL注入。
二、概述
这节课我们来讨论如何使用参数化查询来解决SQL注入的问题,并改写我们的所有方法。
本文配套视频 优酷专辑地址:http://www.youku.com/playlist_show/id_6080910.html
本集地址: http://v.youku.com/v_show/id_XMjY5ODEzMDQw.html
三、主要内容
3.1 参数化查询的优点。
3.3 SqlDataAdapter 。
3.4 总结。
四、优点
防止SQL注入,通过给参数赋值,从而把整个参数都看做一个值去比较,ADO.NET会对一些特殊字符进行转义,而不是字符串拼接。
五、SqlCommand的属性
1 SqlConnection sqlcon = new SqlConnection(connectionString);
2 SqlCommand sqlcom = new SqlCommand();
3 sqlcom.Connection = sqlcon;
sqlcom.CommandText = "select * from tb_user where UserName=@u and UserPassWord=@p";
sqlcom.Parameters.Add("username", SqlDbType.VarChar, 50).Value = "MrYoung";
上面则是为SQLCOM的PARAMETERS添加一个参数,这个参数的名称为username,SqlDbType.VarChar为参数的数据库字段类型为VARCHAR,长度为50。VALUE则是为这个参数赋值为MrYoung。
接下来我们便分别改写我们的增,修,删方法分别如下:
/// <summary>
/// 插入数据
/// </summary>
/// <param name="username"></param>
/// <param name="userpassword"></param>
/// <param name="userage"></param>
/// <param name="userphone"></param>
/// <param name="useraddress"></param>
public static void InsertData(string username,string userpassword,int userage,string userphone,string useraddress)
{
//实例化连接对象
using (SqlConnection sqlcon = new SqlConnection(connectionString))
{
//实例化SQLCOMMAND,注意为默认的空构造函数
using (SqlCommand sqlcom = new SqlCommand())
{
//指定他使用的SQLCONNECTION
sqlcom.Connection = sqlcon;
//设置查询语句
sqlcom.CommandText = "insert into tb_user values (@username,@userpassword,@userage,@userphone,@useraddress)";
//给Parameters添加参数并复制
sqlcom.Parameters.Add("username", SqlDbType.VarChar, 50).Value = username;
sqlcom.Parameters.Add("userpassword", SqlDbType.VarChar, 50).Value = userpassword;
sqlcom.Parameters.Add("userage", SqlDbType.Int, 4).Value = userage;
sqlcom.Parameters.Add("userphone", SqlDbType.VarChar, 50).Value = userphone;
sqlcom.Parameters.Add("useraddress", SqlDbType.VarChar, 50).Value = useraddress;
try
{
sqlcon.Open();
sqlcom.ExecuteNonQuery();
}
catch (Exception e1)
{
sqlcon.Close();
throw new Exception(e1.Message);
}
}
}
}
/// <summary>
/// 修改数据
/// </summary>
/// <param name="username"></param>
/// <param name="userpassword"></param>
/// <param name="userage"></param>
/// <param name="userphone"></param>
/// <param name="useraddress"></param>
public static void UpdateData(int id,string username, string userpassword, int userage, string userphone, string useraddress)
{
using (SqlConnection sqlcon = new SqlConnection(connectionString))
{
using (SqlCommand sqlcom = new SqlCommand())
{
sqlcom.Connection = sqlcon;
sqlcom.CommandText = "update tb_user set username=@username,userpassword=@userpassword,userage=@userage,userphone=@userphone,useraddress=@useraddress where id=@id";
sqlcom.Parameters.Add("username", SqlDbType.VarChar, 50).Value = username;
sqlcom.Parameters.Add("userpassword", SqlDbType.VarChar, 50).Value = userpassword;
sqlcom.Parameters.Add("userage", SqlDbType.Int, 4).Value = userage;
sqlcom.Parameters.Add("userphone", SqlDbType.VarChar, 50).Value = userphone;
sqlcom.Parameters.Add("useraddress", SqlDbType.VarChar, 50).Value = useraddress;
sqlcom.Parameters.Add("id", SqlDbType.Int, 4).Value=id;
try
{
sqlcon.Open();
sqlcom.ExecuteNonQuery();
}
catch (Exception e1)
{
sqlcon.Close();
throw new Exception(e1.Message);
}
}
}
}
/// <summary>
/// 删除数据
/// </summary>
/// <param name="username"></param>
/// <param name="userpassword"></param>
/// <param name="userage"></param>
/// <param name="userphone"></param>
/// <param name="useraddress"></param>
public static void DeleteData(int id)
{
using (SqlConnection sqlcon = new SqlConnection(connectionString))
{
using (SqlCommand sqlcom = new SqlCommand())
{
sqlcom.Connection = sqlcon;
sqlcom.CommandText = "delete from tb_user where id=@id";
sqlcom.Parameters.Add("id", SqlDbType.Int, 4).Value = id;
try
{
sqlcon.Open();
sqlcom.ExecuteNonQuery();
}
catch (Exception e1)
{
sqlcon.Close();
throw new Exception(e1.Message);
}
}
}
}
六、SqlDataAdapter 构造函数 (SqlCommand)
这样我们就可以改写查询方法,同样使用参数化的方法来构造COMMAND,具体如下:
/// <summary>
/// 执行查询语句,返回DataSet
/// </summary>
/// <param name="SQLString">查询语句</param>
/// <returns>DataSet</returns>
public static DataSet getdsByName(string username)
{
using (SqlConnection sqlcon = new SqlConnection(connectionString))
{
DataSet ds = new DataSet();
SqlCommand sqlcom = new SqlCommand();
sqlcom.Connection = sqlcon;
sqlcom.CommandText = "select * from tb_user where username like '%'+@username+'%' ";
sqlcom.Parameters.Add("username", SqlDbType.VarChar, 50).Value = username;
sqlcon.Open();
SqlDataAdapter sqldata = new SqlDataAdapter(sqlcom);
sqldata.Fill(ds);
return ds;
}
}
public static SqlDataReader getread(string u123, string p)
{
SqlConnection sqlcon = new SqlConnection(connectionString);
SqlCommand sqlcom = new SqlCommand();
sqlcom.Connection = sqlcon;
sqlcom.CommandText = "select * from tb_user where UserName=@u and UserPassWord=@p";
sqlcom.Parameters.Add("u", SqlDbType.VarChar, 50).Value = u123;
sqlcom.Parameters.Add("p", SqlDbType.VarChar, 50).Value = p;
try
{
sqlcon.Open();
SqlDataReader sqlread = sqlcom.ExecuteReader(CommandBehavior.CloseConnection);
return sqlread;
}
catch (Exception)
{
return null;
}
}
这里要特别注意的就是LIKE查询的时候的写法:sqlcom.CommandText = "select * from tb_user where username like '%'+@username+'%' ";
七、其他信息
本节对应视频的第四讲[MrYoung教程:易学之道]4ADONET基础之参数化查询,文首我已经给出了连接,建议先看视频再来看文章会更清晰,如有不明白的地方可以加入我们的QQ群交流:群内提供完整PPT和源码下载。
帮助QQ群:13615607,请注明来自博客园
本文配套视频 优酷专辑地址:http://www.youku.com/playlist_show/id_6080910.html
本集地址:http://v.youku.com/v_show/id_XMjY5ODEzMDQw.html
八、本系列已有教程
8.1 [MrYoung教程:易学之道]1ADONET基础及登录模块的实现 1-1
8.2 [MrYoung教程:易学之道]1ADONET基础及登录模块的实现 1-2
浙公网安备 33010602011771号