2013-05-14 89 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

相关问题