zoukankan      html  css  js  c++  java
  • C# ADO.NET SqlDataAdapter中传递参数

    ADO.NET的SQL语句中,往往不是静态的语句,而是需要接受传递过来的参数,比如典型的登录功能,需要查找指定的用户名:

    string sqlQuery = "SELECT * FROM W_User WHERE UserName = '" + userName + "'";

    上例中userName就是传递过来的用户名参数,这个参数可能来自于Windows表单,也可能来自于Web页面的文本框。但上面的代码的应用方式,在实际应用是需要绝对禁止的,因为有可能被黑客利用,写上恶意代码,用来破解数据库,即所谓SQL注入。

    因此,实际应用中,需要使用添加参数的方式完成任务,从而避免SQL注入。比如下面的办法:

                string sqlQuery = "SELECT * FROM W_User";
                sqlQuery += " WHERE UserName = @userName";  //声明形式参数@userName
                SqlCommand comm = new SqlCommand(sqlQuery, conn);   //创建SqlCommand对象
                comm.Parameters.AddWithValue("@userName", userName);  //将实际参数userName传递给SqlCommand对象(comm)的形式参数@userName
                conn.Open();
                SqlDataReader dr = comm.ExecuteReader();

    上述代码中,使用@userName作为形式参数,其中@是形式参数的前缀,后跟实际参数名称。

    对于SqlDataAdapter来说,一般是这样使用的,

                string sqlQuery = "SELECT * FROM W_User";
                SqlDataAdapter da = new SqlDataAdapter(sqlQuery, conn);  
                DataSet ds = new DataSet();
                da.Fill(ds);

    由于这里没有出现SqlCommand对象,因此无法利用SqlCommand对象的参数传递方式完成SqlDataAdapter对象的传递参数,但实际应用中,SqlDataAdapter也需要进行参数传递,问题如何解决呢?

    解决办法是:首先创建SqlCommand对象,并在该对象中传递参数,然后再创建SqlDataAdapter对象,设置其SelectCommand(或InsertCommand, DeleteCommand, UpdateCommand)属性值即可,如下面代码:

                    string sqlQuery;
    
                    sqlQuery = "SELECT * FROM W_User";
                    sqlQuery += " WHERE UserName = @userName";
                    
                    //SqlDataAdapter利用SqlCommand传递参数
                    SqlCommand comm = new SqlCommand(sqlQuery, Conn);
                    comm.Parameters.AddWithValue("@userName", userName);
                    
                    SqlDataAdapter da = new SqlDataAdapter();
                    da.SelectCommand = comm;
    
                    DataSet ds = new DataSet();
                    da.Fill(ds);

    这样的情况下,SqlDataAdapter对象就可以接受传递参数了。

    当然,也可以直接对SqlDataAdapter对象进行传递参数,注意与相应的命令对应(即SelectCommand,InsertCommand, UpdateCommand, DeleteCommand),比如下面的代码,没有使用SqlCommand对象传递参数,而是对SqlDataAdapter对象da使用了 da.SelectCommand.Parameters.AddWithValue()进行,如果对比上一个代码段,可以看出,这里的da.SelectCommand替代了上一个代码段中的SqlCommand对象comm

                    string sqlQuery;
    
                    sqlQuery = "SELECT * FROM W_User";
                    sqlQuery += " WHERE UserName = @userName";
                    
                    //DataAdapter利用SqlCommand传递参数
                    //SqlCommand comm = new SqlCommand(sqlQuery, conn);
                    //comm.Parameters.AddWithValue("@userName", userName);
                    
                    SqlDataAdapter da = new SqlDataAdapter(sqlQuery, conn);
                    //直接使用DataAdapter传递参数
                    da.SelectCommand.Parameters.AddWithValue("@userName", userName);
    
                    DataSet ds = new DataSet();
                    da.Fill(ds);
  • 相关阅读:
    字符串题目
    Java 练习题摘录
    数据库原理及应用-引言
    数学类题目
    牛顿法
    动态规划-最大子段和
    判断数幂
    杭电1096
    算法导论01 几种排序以及其时间复杂度01
    杭电2059龟兔赛跑
  • 原文地址:https://www.cnblogs.com/wusir/p/3545867.html
Copyright © 2011-2022 走看看