2014-07-23 39 views
6

我有半年線的參數如下:如何在一條語句中添加多個參數到SQL命令?

cmd.Parameters.AddWithValue("@variable1", myvalue1); 
    cmd.Parameters.AddWithValue("@variable2", myvalue2); 
    cmd.Parameters.AddWithValue("@variable3", myvalue3); 

等。

有什麼辦法可以壓縮這一點而不直接插入cmd.CommandText?

編輯:我想我可以使用一個很好的老式陣列。我決定堅持這一點。

+0

我不知道爲什麼你試圖壓縮,但我敢肯定你正在做的方式是最簡單而緊湊的方式。 –

+1

沒有辦法縮短這個時間。你爲什麼想要?你可以使用一個完全不同的庫或其他的自動化庫,但它不會更便宜,只是看起來不同。 –

+1

只是好奇心誠實。結果並不是一個更短的路! – user3808188

回答

5

據我所知,你的代碼在行數方面是最緊湊的,但是你可以使用List<SqlParameter>和對象初始值設定語法只有一行以分號結尾來構建你的參數列表,然後將該列表作爲AddRange方法預期的參數陣列

List<SqlParameter> prm = new List<SqlParameter>() 
{ 
    new SqlParameter("@variable1", SqlDbType.Int) {Value = myValue1}, 
    new SqlParameter("@variable2", SqlDbType.NVarChar) {Value = myValue2}, 
    new SqlParameter("@variable3", SqlDbType.DateTime) {Value = myValue3}, 
}; 
cmd.Parameters.AddRange(prm.ToArray()); 

請注意,使用此方法,您需要正確定義參數的數據類型。在我的例子中,我使用了一些任意類型,以顯示正確的語法

有點偏離主題,通過我認爲,在這個一般情況下有趣的是指出,AddWithValue是不被認爲是當你想要得到的可能的最佳性能。

在本文中,關於MSDN How data access code affects database perfomance很好地解釋了爲什麼應該出於性能原因避免使用AddWithValue方法。
總之,使用AddWithValue可能是Sql Server Optimizer的問題,因爲字符串類型的參數傳遞的大小等於字符串的當前長度。但是這會強制Sql Server Optimizer放棄爲以前的相同調用創建的查詢計劃,但使用不同長度的字符串。
最好調用SqlParameter構造函數來指定參數的類型和大小,不用擔心如何調用compress the size

+2

恐怕我看不出如何比原始代碼更加壓縮。 –

+0

不是壓縮它只是一行而不是三行(當然不包括最後一個AddRange) – Steve

+0

但你要添加額外的行來創建一個列表... – DotN3TDev

1

爲了討論的緣故,用你給的代碼示例,其中存儲的過程變量是從字面上命名variabe1,變量2,等等......你可以做這樣的事情:醜陋的代碼

string[] myValues = new string[] { "myvalue1", "myvalue2", "myvalue3", "myvalue4", "myvalue5", "myvalue6" }; 
for (int i = 0; i < 6; i++) { cmd.Parameters.AddWithValue("@variable" + (i + 1),myValues[i]); } 

2線...大聲笑

像這樣的循環可能會派上用場,如果你說25-50的值,雖然我不經常看到。你可以使用2個數組一個變量名和一個值,只要指標匹配,那麼這會工作:

string[] myVarNames = new string[] { "variable1", "variable2", "variableThree", "variable4our", "variableFIVE", "variableSIX" }; 
string[] myValues = new string[] { "myvalue1", "myvalue2", "myvalue3", "myvalue4", "myvalue5", "myvalue6" }; 

for (int i = 0; i < 6; i++) 
{ 
    cmd.Parameters.AddWithValue("@" + myVarNames[i], myValues[i]); 
} 
+1

這可能會激發OleDB和ODBC有趣的解決方案,它們具有未命名的有序參數。 – Larry

+0

是的我已經在過去廣泛使用第二個選項 – user3808188

+1

而不是兩個數組,使用'Dictionary '會消除不匹配索引的擔心。 – ShooShoSha

3

我把這個問題從字面上:」 ...在一個聲明」 :)

史蒂夫代碼是好的,但它可以用最經典的SqlParameter構造函數和隱式陣列申報簡化多一點:

cmd.Parameters.AddRange(new [] 
    { 
     new SqlParameter("@variable1", myValue1}, 
     new SqlParameter("@variable2", myValue2}, 
     new SqlParameter("@variable3", myValue3}, 
    }); 
+2

除非其中一個值是一個值爲零的整數。請參閱http://stackoverflow.com/questions/9999751/difference-between-parameters-add-and-parameters-addwithvalue – Steve

+0

你是對的。將一個硬編碼的0作爲對象'new SqlParameter(「@ param」,(object)0)'投射出來就可以做到這一點,但我同意它不好。 – Larry

+1

不,我不是。感謝您的鏈接,它與 一樣有趣,令人沮喪:「始終指定正確的數據類型,長度,精度和縮放比例將確保您在執行時沒有執行數據類型強制轉換。」 - ARGH我太懶惰了!但我會記住這一點對於表現至關重要的極端情況。 – Larry

0

我認爲這將非常漂亮讀作一個內膽是這樣的:

用法:

// One liner to create and set SqlCommand parameters 
cmd.SetParameters(Parameter("@variable1", myvalue1), Parameter("@variable2", myvalue2), Parameter("@variable3", myvalue3)); 

爲了支持一個襯墊,你需要創建一個函數包裹SQL參數的語義束(數組等)如下:

public SqlParameter Parameter(string name, object value) 
{ 
    return new SqlParameter(name, value); 
} 

與擴展方法創建一個靜態類給我們,我們正在尋找的語法糖。請注意使用params關鍵字,該關鍵字允許將上述調用中的多個參數設置爲SetParameters。

public static class SqlDataUtils 
{ 
    public static void SetParameters(this SqlCommand command, params SqlParameter[] parameters) 
    { 
     command.Parameters.AddRange(parameters); 
    } 
} 

這個答案被接受的答案Key value pairs in C# Params啓發Bryan Watts