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

C# 有人能告诉我为什么这个SQL查询不起作用吗,c#,sql,sql-server,webforms,.net-2.0,C#,Sql,Sql Server,Webforms,.net 2.0,我按照这个回答, 请看我的这些问题以了解场景 我正在尝试而没有工作的内容 private void relate_fruit_crate(List<string> selectedFruitIDs, int selectedCrateID) { string updateStatement = "UPDATE relate_fruit_crate set CrateID = @selectedCrateID where FruitID = @selectedFruitI

我按照这个回答,

请看我的这些问题以了解场景

我正在尝试而没有工作的内容

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();
    }
}
private void relate\u fruit\u板条箱(列出selectedfruitid,int selectedCrateID)
{
string updateStatement=“更新相关水果”板条箱设置板条箱ID=@selected板条箱ID,其中水果ID=@selectedfructID”;
使用(SqlConnection连接=新的SqlConnection(ConnectionString()))
使用(SqlCommand cmd=newsqlcommand(updateStatement,connection))
{
connection.Open();
cmd.Parameters.Add(新的SqlParameter(“@selectedCrateID”,selectedCrateID.ToString());
Add(新的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())));

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

您需要在场景中使用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中有点麻烦。还有一些选项,如表值参数或“拆分”自定义项-否则。。。这有点棘手。最后,您必须添加多个参数(取决于数据),并更改查询以适应需要。如果我可以建议。。。像“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
...
私有无效关联水果板条箱(列出选定水果ID、int选定板条箱ID)
{
//注意这里有点不寻常的“in”(没有妄想症)——这是因为
//dapper要做一些巫术。。。
使用(SqlConnection连接=新的SqlConnection(ConnectionString()))
{
connection.Open();
连接。执行(
“更新relate_fruit_板条箱集合板条箱ID=@Selected板条箱ID,其中@SelectedFruitID中的FruitID”,
新的{selectedFruitIDs,selectedCrateID});
}
}
在这里,“dapper”完成了所有的工作,找出如何使用多个参数在中表达该
,并添加正确数量的参数。它也简单得多(特别是,看看我们对命令和参数所做的工作有多少;它也能很好地处理读者)


Dapper is

多值参数查询在TSQL中有点麻烦。还有一些选项,如表值参数或“拆分”自定义项-否则。。。这有点棘手。最后,您必须添加多个参数(取决于数据),并更改查询以适应需要。如果我可以建议。。。像“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
...
私有无效关联水果板条箱(列出选定水果ID、int选定板条箱ID)
{
//注意这里有点不寻常的“in”(没有妄想症)——这是因为
//dapper要做一些巫术。。。
使用(SqlConnection连接=新的SqlConnection(ConnectionString()))
{
connection.Open();
连接。执行(
“更新relate_fruit_板条箱集合板条箱ID=@Selected板条箱ID,其中@SelectedFruitID中的FruitID”,
新的{selectedFruitIDs,selectedCrateID});
}
}
在这里,“dapper”完成了所有的工作,找出如何使用多个参数在
中表达该
,并添加正确数量的参数。它也简单得多(特别是,看看我们对命令和参数所做的工作有多少;它也能很好地处理读者)


整洁是定义“不工作”。数据库中的数据不更新?是否尝试直接在SQL server中运行?请阅读定义“不工作”。数据库中的数据不更新?是否尝试直接在SQL server中运行?请阅读“是”
中的参数必须是
,而不是
=
,但该参数最终仍将仅为一个串联字符串值。这仅在ID为数字时有效。您需要向每个值添加一个单引号,但不能参数化包含引号的字符串串联列表,因为这只会转义引号。我不知道如何使用参数来实现这一点。@krizzzn在上面的最新帖子中,您在显示的代码中使用了“=”not“in”,您正在寻找一个文本
“@selectedfruitid”
-我怀疑这是其中任何一个的
FruitID
,但是is与参数值完全不相关是的,它需要在
,而不是
=
,但该参数最终仍然只是一个串联的字符串值。这仅在ID为数字时有效。您需要向每个值添加一个单引号,但不能参数化包含引号的字符串串联列表,因为这只会转义引号。我不知道该怎么做