代码改变世界

[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.2 SqlCommand的属性。

  3.3 SqlDataAdapter 。

  3.4 总结。

四、优点

  防止SQL注入,通过给参数赋值,从而把整个参数都看做一个值去比较,ADO.NET会对一些特殊字符进行转义,而不是字符串拼接。

五、SqlCommand的属性

  5.1 SqlCommand.Connection 属性:获取或设置 SqlCommand的此实例使用的连接。
 
1 SqlConnection sqlcon = new SqlConnection(connectionString);
2 SqlCommand sqlcom = new SqlCommand();
3 sqlcom.Connection = sqlcon;
 
  5.2 SqlCommand.CommandText 属性:获取或设置要对数据源执行的 SQL 语句。
 
            sqlcom.CommandText = "select * from tb_user where UserName=@u and UserPassWord=@p";
 
 
  5.3 SqlCommand.Parameters 属性:获取设置参数列表。表示相关联的参数的集合
 
                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

  8.3 [MrYoung教程:易学之道]2ADONET基础之数据展现

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