1

我按照这个答案,

如何将 List<int> 提供给 SQL 参数?

请参阅我的这些问题以了解场景,

如何在 C# 的单个 SQL 查询中更新水果列表的 Crate ID

我如何更新 SQL 表逻辑

我正在尝试但没有工作

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

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

4

2 回答 2

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,但我找不到。

旧帖子::

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

[……]

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

和等于 (=) 查询将只匹配单个值。

于 2013-05-14T10:39:39.583 回答
1

多值参数查询在 TSQL 中有点让人头疼。有诸如表值参数或“拆分”UDF之类的选项 - 否则......这有点棘手。您最终不得不添加多个参数(取决于数据),并更改查询以适应。如果我可以建议......像“dapper”这样的库可以在这里帮助你 - 它旨在使这样的场景变得简单:

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可从 NuGet 免费获得

于 2013-05-14T11:14:35.060 回答