有人能告诉我为什么这个SQL查询不起作用

时间:2013-05-14 10:35:32

标签: c# sql sql-server webforms .net-2.0

我按照这个回答,

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();
    }
}

我的代码运行时没有任何错误,

2 个答案:

答案 0 :(得分: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())));

和equals(=)查询只匹配一个值。

答案 1 :(得分: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 });
    }
}

这里“dapper”完成所有工作,确定如何使用多个参数表达in,添加正确数量的参数。它也更容易(特别是,看看我们用命令和参数做了多少工作;它也能很好地处理读者)。

Dapper是freely available from NuGet