c# - 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 命令的参数看起来并没有被它们的实际值替换。我希望能够在编译命令时看到它们的值,这样我就可以查看是否正在发送正确的命令。有任何想法吗?
解决方案
答案基于我的假设,即您期望查询语句(字符串)发生变化。该假设基于您的措辞以及代码语句中的最后一句话。
Console.WriteLine(command.CommandText);
查询文本没有改变,即。查询文本中的参数不会替换为分配的参数值。参数及其值与查询文本一起发送到 DBMS 以供执行。在 Sql Server 中,如果您要使用 Profiler 分析 Sql Server 实例,您可以看到这一点。
作为旁注,我不建议您使用AddWithValue
. 另请参阅我们可以停止使用 AddWithValue() 了吗?. 相反,只需使用Add
. 此外,您应该为参数提供有意义的名称,例如“@errorLevel”,如果可以的话,它会使调试更容易。
command.Parameters.Add("@errorLevel", SqlDbType.Int).Value = errorLevel;
调用时不必在参数名称前加上“@”前缀,Add
因为如果您不这样做,方法将为其完成。虽然这被认为是好的做法,但这是一个见仁见智的问题。
推荐阅读
- excel - VBA:在用户窗体的函数之间传递变量
- javascript - webpack:具有属性的导出/导入功能
- arrays - 将元组中的集合传输到 CPLEX 中的数组?
- octopus-deploy - 在 SQL 脚本中访问 Octopus Deploy 的系统变量
- javascript - 如果值已存在于 Javascript 集中,如何删除它
- php - 将 foreach 循环之外的数组值动态加载到电子邮件中
- python - 无法让我的图表使用来自 mongoDB 的数据
- android - 我有一个膨胀类 android.support.design.widget.BottomNavigationView 错误。有什么想法吗?
- javascript - 应该如何声明一个空的时间戳变量,以便成为一个全局变量,以便我们稍后给它一个值?
- java - Jaxb2-maven-plugin 错误 java11 schema_reference