繁体   English   中英

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

[英]Can someone tell me why this SQL query not working

我遵循了这个答案,

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

请参阅我的这些问题以了解情况,

如何在C#中的单个SQL查询中更新水果列表的板条箱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();
    }
}

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

您需要在方案中使用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())));

和equals(=)查询将仅匹配单个值。

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

这里的“短小精悍”确实搞清楚如何来表达的一切工作in使用多个参数,将参数正确的数字。 它也容易得多(特别是,看看我们使用命令和参数所做的工作很少;它也很好地处理了读者)。

Dapper 可从NuGet免费获得

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM