我有一個使用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注入攻擊,而且通常也可以快得多 - 尤其是在重複執行時。 –