2016-04-27 90 views
-1

刚发现一些奇怪的事情, 如果我写的SQL语句的命令,像这样:SQL UPDATE命令不会Command.Parameters.Add/AddWithValue工作

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枚举器。

感谢, 利亚姆

+0

无论什么原因,我讨厌以非标准方法解决问题;出于各种安全原因,您不应该使用像这样的SQL查询; – techspider

+0

人们,我知道我不应该像第二个例子那样使用SQL查询,我只是给出了一个有用的例子。我通常总是为我的命令添加参数,但是在这个问题中,我简要介绍了你不能出于某种原因而想知道为什么! @techspider – LiamT98

回答

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(); 
+0

谢谢你的答案!我知道我不应该像第二个例子中那样使用SQL语句,我只是想举一个例子说明它为什么起作用以及为什么以我正常的方式添加参数不起作用!我一直使用命名参数与OleDbCommands,他们往往总是工作而不是在这种情况下!再次感谢您的答案! @Rion威廉姆斯 – LiamT98