SQL UPDATE 命令不适用于 Command.Parameters.Add/AddWithValue [重复]

Posted

技术标签:

【中文标题】SQL UPDATE 命令不适用于 Command.Parameters.Add/AddWithValue [重复]【英文标题】:SQL UPDATE command won't work with Command.Parameters.Add/AddWithValue [duplicate] 【发布时间】:2016-04-27 17:46:49 【问题描述】:

刚刚发现了一些奇怪的东西, 如果我为这样的命令编写 SQL 语句:

command.CommandText = "UPDATE LoginTbl SET PW = @pw WHERE TwyID = @twyID";
command.Parameters.AddWithValue("@pw", pw_txt.Text);
command.Parameters.AddWithValue("@twyID", TwyID.ToString());
command.ExecuteNonQuery();

SQL 命令将运行而不会引发异常,但它根本不会更新数据库。 奇怪的是,如果我写的命令不带参数:

command.CommandText = "UPDATE LoginTbl SET PW = '"+pw_txt.Text+ "' WHERE TwyID = '"+TwyID.ToString()+"'";
command.ExecuteNonQuery();

SQL 命令运行完美,但这次它实际上更新了数据库!

这让我有些困惑,因为我非常习惯在大多数 SQL 命令中使用参数。

想知道是否有人知道为什么 UPDATE 语句特别不接受 OleDbParameters 枚举器。

谢谢, 利亚姆

【问题讨论】:

不管是什么原因,我都讨厌用非标准的方法解决这个问题;出于各种安全原因,您不应使用这样的 SQL 查询; 各位,我知道我不应该像在第二个示例中那样使用 SQL 查询,我只是给出了一个可行的示例。我通常总是在我的命令中添加参数但是在这个问题中我概述了由于某种原因你不能并且想知道为什么! @techspider 【参考方案1】:

首先,您真的不想使用第二种方法(字符串连接),因为它会导致各种 SQL 注入问题以及涉及错误传递参数的问题。

如果您使用的是OleDbConnectionOleDbCommand,而不是SqlConnectionSqlCommand,您可能需要try not using named parameters as they are not supported:

OLE DB .NET 提供程序不支持传递命名参数 SQL 语句或存储过程的参数 当 CommandType 设置为 Text 时的 OleDbCommand。在这种情况下, 必须使用问号 (?) 占位符

而只是使用?。只需确保以正确的顺序添加参数:

command.CommandText = "UPDATE LoginTbl SET PW = ? WHERE TwyID = ?";
command.Parameters.AddWithValue("@pw", pw_txt.Text);
command.Parameters.AddWithValue("@twyID", TwyID.ToString());
command.ExecuteNonQuery();

【讨论】:

感谢您的回答!我知道我不应该像在第二个示例中那样使用 SQL 语句,我只是想举例说明它为什么起作用以及为什么以我做的正常方式添加参数不起作用!我一直在使用带有 OleDbCommands 的命名参数,它们通常总是在这种情况下不起作用!再次感谢您的回答! @里昂威廉姆斯 非常感谢您的解决方案,但我尝试了一些其他方法,使用 (NpgsqlCommand cmd = new NpgsqlCommand(query, con)) 而不是 ?标记我使用 :PW 和 cmd.Parameters.AddWithValue("PW", (object)PW == "" ? DBNull.Value : (object)PW);以此类推。

以上是关于SQL UPDATE 命令不适用于 Command.Parameters.Add/AddWithValue [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Nx CLI run many command 不适用于多个应用程序

简单的 SQL 命令不适用于特定参数

sql 命令不适用于 auto_increment

SQL 命名法:INSERT/UPDATE/DELETE 的“查询”或“命令”?

.validator('update') 不适用于动态添加的字段

linux 装好了centos系统,输入命令apt-get update 提示command not found是啥原因