[轉]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);