0

我有一个使用显式 SQL 更新命令更新 SQL Server 数据库ExecuteNonQuery()。但是,如果更新值与之前的更新匹配(例如,我将列从 1 更改为 2,然后再更改为 1,然后再更改为 2,对于同一行),即使ExecuteNonQuery返回 1,更新也不会发生。

ExecuteQuery当两个连续的选择语句相同时,我注意到了类似的问题;我通过设置一个等于唯一值的变量然后添加来解决这个问题

AND the_unique_value = the_unique_value

到选择。但是,将此添加到更新中不起作用。

这是更新的 .NET 代码:

(注意TheValueTheKey是字符串)

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 命令,但我不想用“不必要的”数据修改表。由于缺乏更好的工作,是否有另一种方法可以让更新每次都“提交”?

4

3 回答 3

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。当然,如果命令中的数据相同,则将是相同的数据。

于 2012-10-09T15:59:27.507 回答
0

如果您想在事务期间将信息持久化到数据库中,则确实必须使用 commit 命令。如果您不提交,则不会在数据库中更新信息。您不需要额外的一行来提供额外的信息。

于 2012-10-09T15:53:23.073 回答
0

事实证明,SQL Server 与它无关 - 问题是,对进行更新的 .NET 函数的 AJAX 调用从未真正调用过该函数,而是执行了与调用相关的“成功”代码。将具有唯一值的虚拟参数添加到调用修复它。

于 2012-10-10T13:26:40.587 回答