我有一个使用ExecuteNonQuery()
的显式SQL更新命令更新SQL Server数据库。但是,如果更新值与先前的更新相匹配(例如,我将列从1更改为2,然后回到1,然后回到2,对于同一行),即使ExecuteNonQuery
返回1,更新也不会发生。.NET中的SQL Server更新不起作用,但返回1行更新
当两个连续的select语句完全相同时,我注意到类似的问题ExecuteQuery
;我通过设置一个等于一个唯一值的变量来解决此问题,然后添加
AND the_unique_value = the_unique_value
来选择。但是,将此添加到更新不起作用。
下面是更新的.NET代码:
(注TheValue
和TheKey
都是字符串)
SqlConnection conn = new SqlConnection(SomeConnectionString);
conn.Open();
try
{
SqlCommand cmd = new SqlCommand
("update my_table "
+ "set the_value = '" + TheValue + "' "
+ "where the_key = '" + TheKey + "'"
, conn);
ReturnValue = cmd.ExecuteNonQuery();
}
catch (Exception e)
{
ReturnValue = -2;
}
conn.Close();
这就是所谓的三倍。每次,TheKey
是“1”。
第一次,TheValue
是“1”; ReturnValue
设置为1,更新成功。
第二次,TheValue
是“2”; ReturnValue
设置为1,更新成功。
第三次,TheValue
再次为“1”; SQL命令现在与第一次使用的 相同。 ReturnValue
设置为1,但不发生更新。
我可以在表中添加一个列,该列将包含一个虚拟值,仅用于确保每个更新都具有不同的SQL命令,但我不想用“不必要的”数据修改表。是否有另一种方式来获得更新,因为缺乏更好的工作,每次都会“提交”?
所以在第三次执行后值是“2”? –
是的,第三次执行后数据库中的值是“2”。 –
对于其中一个 - 你应该**从不**连接你的SQL语句并执行它们。这会将您的代码打开为SQL注入攻击。相反:使用**参数化查询**为您的SQL语句提供参数;这不仅可以保护您免受SQL注入攻击,而且通常也可以快得多 - 尤其是在重复执行时。 –