ADO.NET基礎瑣碎總結-----參數化查詢


       參數化查詢(Parameterized Query )是指在設計與數據庫鏈接並訪問數據時,在需要填入數值或數據的地方,使用參數 (Parameter) 來給值,這個方法目前已被視為最有效可預防SQL注入攻擊 (SQL Injection) 的攻擊手法的防御方式。下面將重點總結下Parameter構建的幾種常用方法。

      說起參數化查詢當然最主要的就是如何構造所謂的參數:比如,我們登陸時需要密碼和用戶名,一般我們會這樣寫sql語句,Select * from Login where  username= @Username and password = @Password,為了防止sql注入,我們該如何構建@Username和@Password兩個參數呢,下面提供六種(其實大部分原理都是一樣,只不過代碼表現形式不一樣,以此僅作對比,方便使用)構建參數的方法,根據不同的情況選用合適的方法即可:

     說明:以下loginId和loginPwd是戶登陸時輸入登陸用戶名和密碼,DB.conn是數據庫連接,用時引入using System.Data.SqlClient命名空間

      方法一:

SqlCommand command = new SqlCommand(sqlStr, DB.conn);
command.Parameters.Add("@Username", SqlDbType.VarChar);
command.Parameters.Add("@Pasword", SqlDbType.VarChar);
command.Parameters["@Username"].Value = loginId;
command.Parameters["@Pasword"].Value = loginPwd;

      方法二:

SqlCommand command = new SqlCommand();
command.Connection = DB.conn;
command.CommandText = sqlStr;
command.Parameters.Add(new SqlParameter("@Username", loginId));
command.Parameters.Add(new SqlParameter("@Pasword", loginPwd));

      方法三:

Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn);
cmd.parameters.add("@Username",DbType.varchar).value=loginId;
cmd.parameters.add("@Pasword",DbType.varchar).value=loginPwd;

      方法四:

Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn);
cmd.parameters.addwithvalue("@Username",loginId);
cmd.parameters.addwithvalue("@Pasword",loginPwd);

      方法五:

  Sqlcommand cmd=new Sqlcommand(sqlStr, DB.conn);  
  SqlParameter para1=new SqlParameter("@Username",SqlDbType.VarChar,16);
para1.Value=loginId;
cmd.Parameters.Add(para1);
SqlParameter para2=new SqlParameter("@Pasword",SqlDbType.VarChar,16);
para2.Value=loginPwd;
cmd.Parameters.Add(para2);

      方法六:

 SqlParameter[] parms = new SqlParameter[]
{
new SqlParameter("@Username", SqlDbType.NVarChar,20),
new SqlParameter("@Pasword", SqlDbType.NVarChar,20),
};
SqlCommand cmd = new SqlCommand(sqlStr, DB.conn);
// 依次給參數賦值
parms[0].Value = loginId;

parms[1].Value = loginPwd;
//將參數添加到SqlCommand命令中
foreach (SqlParameter parm in parms)

{
cmd.Parameters.Add(parm);
}

      后記:鑒於園友對 dedeyi鬼火飄盪 ,guihwu 的疑問,我在寫一個說明。六種方法其實我想大家都明白微軟的底層都是一樣的有興趣的可以反編譯一下,只是寫法和實現方法的不同,也可以說是語法糖,但是每個人都會選擇一個自己想用的,我就隨便總結了下。下面具體在把這些方法做個簡要說明。方法一和方法二都是用SqlCommand的parameters屬性的add方法,add方法里面有七個構造函數,其實方法二就是用的第一個構造函數,至於為什么沒寫類型是因為有以object為參數的構造函數,當然還有其他的構造函數可以用,可以加入類型參數、指定長度等,我僅僅是說下形式,具體的msdn說的非常清楚。方法三和方法一完全一樣僅僅形式不同。至於方法四那就不同了:在.Net Framework 2.0中SqlClient增加了AddWithValue(string parameterName, object value)方法。 該方法簡化了調用儲存過程的輸入參數過程,在運行時對所輸入的數據類型進行判斷,獲取對應的數據庫類型。因此該方法在運行效率上比用  Add(string parameterName, SqlDbType sqlDbType, int size, string sourceColumn)方法要低。在效率要求較高的地方仍然建議使用Add()方法,其它場合可以使用AddWithValue()簡化代碼編寫量。方法五和方法二也是一樣的,方法五只是分開寫了。方法六用了c#3.0的特性——集合初始化器,代碼也很清晰,原理同上,不再贅述。

 

-----------------------------------------------------------------------------------------------------------------------------------------------

 

作者:GavinDream(GavinDream主頁 博客園
出處:http://www.cnblogs.com/fuchongjundream/
任何轉載必須保留完整文章,在顯要地方顯示署名以及原文鏈接。如您有任何疑問或者授權方面的協商,請發郵件給我 或者 留言

 

 

 


免責聲明!

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



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