2012-02-06 237 views
21

基本上CommandsParameters和參數具有的功能,如AddAddWithValue,等在我見過的所有教程,我通常發現他們正在使用Add代替AddWithValue差異與Parameters.Add和Parameters.AddWithValue

.Parameters.Add("@ID", SqlDbType.Int) 

VS

.Parameters.AddWithValue("@ID", 1) 

有什麼理由不使用AddWithValue?我寧願使用它

Parameters.Add("@ID", SqlDbType.Int, 4).Value = 1 

因爲它節省了我的編碼時間。那哪個更好用?哪個安全使用?它會提高性能嗎?

+1

看看這個SO問題,這看起來像一樣的事情:http://stackoverflow.com/questions/5445663/difference-between-adding-parameters-to-stored-procedure-in-sql-server- 2005 – CCBlackburn 2012-02-06 02:36:16

+1

閱讀:http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ – RemarkLima 2015-01-01 15:23:23

回答

24

使用Add()方法,可以通過指定數據的類型和長度來限制用戶輸入 - 特別是對於varchar列。

.Parameters.Add("@name",SqlDbType.VarChar,30).Value=varName; 

AddWithValue()情況下方法(值的隱式轉換)時,它發送nvarchar的值到數據庫。

+1

請注意,在.Add讓我們來添加一個SqlParameter/OleDbParameter/DbParameter。如果在參數實例中忽略參數名稱(通過將其設置爲NULL),您將遇到令人討厭的性能下降:.Net框架將爲您創建名稱'Parameter1..x'。現在這看起來對於SqlParameter來說很愚蠢,你會想要匹配@variable。但是,使用OleDbParameter ... – 2017-02-02 14:42:02

2

我會使用正常情況下的AddWithValue。只有當列類型與.net轉換CLR類型的方式不同時,才使用Add(name,dbtype ...)

8

相信也有一些缺點,使用AddWithValue影響SQL緩存Excection計劃請參閱參數長度部分here

+0

考慮到鏈接文章中的這個可怕的句子: 「通過在使用ParameterCollection.AddWithValue時未指定長度,您可以在計劃緩存中擁有許多不同的查詢,因爲您擁有不同的字符串長度。 「 這裏可能是最有價值的迴應:) – 2015-03-04 19:46:53

+0

那篇文章挺老的,那還是行爲嗎? – Maslow 2015-09-17 12:59:04