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