1. 程式人生 > >[轉]C# ADO.NET SqlDataAdapter中傳遞引數

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

複製程式碼