首页 > 解决方案 > C# sql 命令参数没有被使用?

问题描述

SqlCommand command = new SqlCommand("UPDATE qcCheckList SET reviewed = @0, errorLevel = @1, comment = @2 WHERE guid = @3 and itemId = @4", connection);
command.Parameters.AddWithValue("0", cli.reviewed.Checked);
int errorLevel = 0;
if (cli.error.Text == "Level 1")
    errorLevel = 1;
else if (cli.error.Text == "Level 2")
    errorLevel = 2;
else if (cli.error.Text == "Level 3")
    errorLevel = 3;
command.Parameters.AddWithValue("1", errorLevel);
command.Parameters.AddWithValue("2", cli.comments.Text);
command.Parameters.AddWithValue("3", guid);
command.Parameters.AddWithValue("4", cli.itemId);
command.ExecuteNonQuery();
Console.WriteLine(command.CommandText);

当我运行这段代码时,我的 sql 命令的参数看起来并没有被它们的实际值替换。我希望能够在编译命令时看到它们的值,这样我就可以查看是否正在发送正确的命令。有任何想法吗?

标签: c#sql

解决方案


答案基于我的假设,即您期望查询语句(字符串)发生变化。该假设基于您的措辞以及代码语句中的最后一句话。

Console.WriteLine(command.CommandText);

查询文本没有改变,即。查询文本中的参数不会替换为分配的参数值。参数及其值查询文本一起发送到 DBMS 以供执行。在 Sql Server 中,如果您要使用 Profiler 分析 Sql Server 实例,您可以看到这一点。


作为旁注,我不建议您使用AddWithValue. 另请参阅我们可以停止使用 AddWithValue() 了吗?. 相反,只需使用Add. 此外,您应该为参数提供有意义的名称,例如“@errorLevel”,如果可以的话,它会使调试更容易。

command.Parameters.Add("@errorLevel", SqlDbType.Int).Value = errorLevel;

调用时不必在参数名称前加上“@”前缀,Add因为如果您不这样做,方法将为其完成。虽然这被认为是好的做法,但这是一个见仁见智的问题。


推荐阅读