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