c# - 谁能告诉我为什么这个 SQL 查询不起作用

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

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

最佳答案

您需要在您的场景中使用 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 注入(inject))或分别为每个 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())));

和等号 (=) 查询只会匹配单个值。

关于c# - 谁能告诉我为什么这个 SQL 查询不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16540951/

相关文章:

c# - 帮助在 C# 中编码(marshal) C 函数

php - 无法在 php 中连接表和获取数组

sql - 按逗号连接列的 sql 查询分组

SQL Server 如何始终回滚整个事务

sql-server - 中止违反外键约束的存储过程

sql-server - 更新 SQL Server 索引键列后缺少行

c# - 当我尝试从 Array 对象调用它时,无法识别 IList 接口(interface)中的 Remove 方法

c# - 在 C# 中从 Base36 解码为十进制

c# - ThreadSafety 和静态字段 - 混淆?

c# - 将值从 ListView 传递到另一种形式的文本框 C#