首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有人能告诉我为什么这个SQL查询不能工作吗?

有人能告诉我为什么这个SQL查询不能工作吗?
EN

Stack Overflow用户
提问于 2013-05-14 10:35:31
回答 2查看 163关注 0票数 1

我跟着这个回答,

到SQL参数?

请看我的这些问题来了解情况,

如何在c#中更新单一SQL查询中的水果列表的Crate

如何更新SQL表逻辑?

我正在尝试和不工作的

代码语言:javascript
运行
复制
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();
    }
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-14 10:39:39

您需要在场景中使用IN关键字。问题是,SqlCommand.Parameters模式不构建查询本身,而是调用数据库上的存储过程:

代码语言:javascript
运行
复制
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创建查询。(警告!或者分别调用每个ID的查询。

也许有办法在SqlCommand.Parameters上做到这一点,但我找不到。

旧员额::

代码语言:javascript
运行
复制
string updateStatement = "UPDATE relate_fruit_crate set CrateID IN ('@selectedCrateID') where FruitID = '@selectedFruitIDs'";

……

代码语言:javascript
运行
复制
cmd.Parameters.Add(new SqlParameter("@selectedFruitIDs", String.Join("','",selectedFruitIDs.ToArray())));

而等于(=)查询将只匹配一个值。

票数 4
EN

Stack Overflow用户

发布于 2013-05-14 11:14:35

在TSQL中,多值参数查询有点麻烦。有些选项,如表值参数,或“拆分”UDFs否则.这有点棘手。最后,您必须添加多个参数(取决于数据),并根据需要更改查询。如果我能建议..。像"dapper“这样的库可能会在这里帮助您--它的设计目的是让这样的场景变得简单:

代码语言:javascript
运行
复制
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免费获得

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16540951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档