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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM