[转]C# ADO.NET SqlDataAdapter中传递参数

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

复制代码

 

posted @ 2019-01-03 10:49  grj001  阅读(90)  评论(0编辑  收藏  举报