參數化查詢(Parameterized Query )是指在設計與數據庫鏈接並訪問數據時,在需要填入數值或數據的地方,使用參數 (Parameter) 來給值,但是很多童鞋都不知道參數化查詢有哪些好處。
1、防止SQL注入;2、提高查詢性能(主要是可以復用查詢計划),這點在數據量較大時尤為重要
一、防止SQL注入
參數化查詢目前已被視為最有效可預防SQL注入攻擊 (SQL Injection) 的攻擊手法的防御方式,相信大家都知道這個,在這里我將不會多講。
二、提高查詢性能
一個簡單的sql語句,通常有以下幾種寫法:
string sql=string.format(@"select userName from userInfo where Id={0}",id);
string sql=@"select userName from userInfo where Id="+id;
string sql=@"select userName from userInfo where Id=@id";
相信有一些基礎的童鞋都知道字符串拼接的性能如何了,尤其是多次拼接。
這里只講第三種,參數化查詢,代碼如下:

1 using System.Data; 2 using System.Data.SqlClient; 3 4 namespace HelperCommon 5 { 6 public class Error500 7 { 8 //通過用戶id獲取名字 9 public string GetUserNameById(int id) 10 { 11 string sql = @"select userName from userInfo where Id=@id"; 12 //參數為值類型(int,bigint,decimal,datetime等)指定參數類型即可,不必指定長度 13 SqlParameter para = new SqlParameter("@id",SqlDbType.Int); 14 para.Value = id; 15 16 object name= SqlHelper.ExecuteScalar(SqlHelper.Dev2, CommandType.Text, sql, para); 17 if (null == name) 18 return string.Empty; 19 return (string) name; 20 } 21 22 //通過用戶名獲取用戶id 23 public int GetUserIdByName(string name) 24 { 25 string sql = @"select userName from userInfo where Id=@name"; 26 //參數類型為可變長度時(varchar,nvarchar,char等)請指定參數類型及長度 27 /*傳值為varchar(max)或者nvarchar(max)時,參數長度指定為-1即可*/ 28 SqlParameter para = new SqlParameter("@name", SqlDbType.VarChar,5); 29 para.Value = name; 30 object id = SqlHelper.ExecuteScalar(SqlHelper.Dev2, CommandType.Text, sql, para); 31 if (null == name) 32 return 0; 33 return (int)id; 34 } 35 } 36 }
參數化查詢可以提高查詢性能(主要是可以復用查詢計划),這點在數據量較大時尤為重要。