我使用ExecuteNonQuery()
使用显式SQL更新命令更新SQL Server数据库。但是,如果更新值与先前的更新匹配(例如,我将列从1更改为2,然后返回到1,然后再更改为2,对于同一行),即使{{1}更新也不会发生更新}返回1.
当两个连续的select语句相同时,我注意到与ExecuteNonQuery
类似的问题;我通过设置一个等于唯一值的变量然后添加
ExecuteQuery
选择。但是,将此添加到更新不起作用。
以下是更新的.NET代码:
(注意AND the_unique_value = the_unique_value
和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();
为“1”。
第一次,TheKey
为“1”; TheValue
设置为1,更新成功。
第二次,ReturnValue
为“2”; TheValue
设置为1,更新成功。
第三次,ReturnValue
再次为“1”; SQL命令现在与使用的命令相同
第一次。 TheValue
设置为1,但不会进行更新。
我可以在表中添加一个列,该列将保存一个虚拟值,仅用于确保每个更新都有不同的SQL命令,但我不想用“不必要的”数据修改表。还有另一种方法可以让更新,因为缺乏更好的工作,每次都“提交”吗?
答案 0 :(得分:1)
我会将sql代码更改为......
using (SqlConnection conn = new SqlConnection("My Connection")) //just do a using block here
{
SqlCommand cmd = new SqlCommand();
//you should never use string concatination here... ever..
cmd.CommandText = "update myTable set foo = @foo where bar = @bar";
cmd.Parameters.Add("@foo", "foo");
cmd.Parameters.Add("@bar", "bar");
conn.Open();
cmd.Connection = conn;
cmd.ExecuteNonQuery();
}
如果匹配的话,返回的数字将为1。当然,如果命令中的数据相同,它将是相同的数据。
答案 1 :(得分:0)
如果要在转换期间将信息保留到数据库,则必须确实使用commit命令。如果您不提交,则不会在数据库上更新信息。 您不需要额外的行来获取额外的信息。
答案 2 :(得分:0)
事实证明,SQL Server与它无关 - 问题是,执行更新的.NET函数的AJAX调用从未实际调用该函数,而是执行与调用关联的“成功”代码。添加具有唯一值的虚拟参数来修复它。