2013-05-14 131 views
1

這個SQL查詢我跟着這個答案,誰能告訴我,爲什麼不工作

How can I supply a List<int> to a SQL parameter?

請參閱我的這些問題對於瞭解情況,

How can I update Crate IDs of List of Fruits in single SQL query in c#

how can i update SQL table logic

我在努力而不是在工作

private void relate_fruit_crate(List<string> selectedFruitIDs, int selectedCrateID) 
{ 
    string updateStatement = "UPDATE relate_fruit_crate set CrateID = @selectedCrateID where FruitID = @selectedFruitIDs"; 

    using (SqlConnection connection = new SqlConnection(ConnectionString())) 
    using (SqlCommand cmd = new SqlCommand(updateStatement, connection)) 
    { 
     connection.Open(); 
     cmd.Parameters.Add(new SqlParameter("@selectedCrateID", selectedCrateID.ToString())); 
     cmd.Parameters.Add(new SqlParameter("@selectedFruitIDs", String.Join(",",selectedFruitIDs.ToArray()))); 

     cmd.ExecuteNonQuery(); 
    } 
} 

我的代碼運行沒有任何錯誤,

+0

界定 「不工作」。數據不會在數據庫中更新?你是否嘗試直接在SQL服務器上運行? – Raptor 2013-05-14 10:36:34

+0

請閱讀http://meta.stackexchange.com/questions/10647/how-do-i-write-a-good-title – 2013-05-14 10:37:23

回答

4

您需要使用IN關鍵字在您的方案。問題是,SqlCommand.Parameters模式不建立查詢本身,而是對數據庫調用存儲過程:

exec sp_executesql N'UPDATE relate_fruit_crate set CrateID = @selectedCrateID where FruitID in(''@selectedFruitIDs'')', N'@selectedCrateID nvarchar(1),@selectedFruitIDs nvarchar(5)', @selectedCrateID = N'1', @selectedFruitIDs = N'1,2' 

爲陣列逃脫這將無法正常工作。

解決方法是使用正常的StringBuilder來創建查詢。 (警告!SQL注入)或分別爲每個ID調用查詢。

也許有一種方法可以用SqlCommand.Parameters來做到這一點,但我找不到一個。

OLD POST ::

string updateStatement = "UPDATE relate_fruit_crate set CrateID IN ('@selectedCrateID') where FruitID = '@selectedFruitIDs'"; 

[....]

cmd.Parameters.Add(new SqlParameter("@selectedFruitIDs", String.Join("','",selectedFruitIDs.ToArray()))); 

和等於(=)的查詢將只匹配的單個值。

+0

+1,有多奇怪,但它仍然無法正常工作 – Mathematics 2013-05-14 10:49:15

+0

是的,它需要'In'而不是'=',但參數仍然只是一個串聯的字符串值。 – juharr 2013-05-14 10:49:42

+0

僅當您的ID是數字時纔有效。您需要爲每個值添加一個單引號[juharr指出](http:// stackoverflow。COM /問題/ 16540951 /可-人,推薦給我,爲什麼 - 這-SQL查詢 - 不工作/ 16541024#comment23757338_16541108) – krizzzn 2013-05-14 10:50:11

1

多值參數查詢在TSQL中有點痛苦。有些選項像表值參數,或者「拆分」UDF - 否則......這有點棘手。您最終不得不添加多個參數(取決於數據),並更改查詢以適應。如果我可以建議......就像「短小精悍」一庫可以幫助你在這裏 - 這是設計使場景像這樣簡單:

using Dapper; // at the top of your code file, to enable dapper 
... 
private void relate_fruit_crate(List<string> selectedFruitIDs, int selectedCrateID) 
{ 
    // note the slightly unusual "in" here (no paranethesis) - that is because 
    // dapper is going to do some voodoo...  
    using (SqlConnection connection = new SqlConnection(ConnectionString())) 
    { 
     connection.Open(); 
     connection.Execute(
      "UPDATE relate_fruit_crate set CrateID = @selectedCrateID where FruitID in @selectedFruitIDs", 
      new { selectedFruitIDs, selectedCrateID }); 
    } 
} 

這裏「短小精悍」確實搞清楚如何的所有工作使用多個參數表示in,添加正確的參數數量。它也簡單得多(特別是,看看我們在命令和參數上做了多少工作;它也很好地處理讀者)。

小巧玲瓏是freely available from NuGet

相關問題