ADO.NET和DataSet中丢失的更新

时间:2011-10-26 13:29:04

标签: c# .net sql sqlite ado.net

我有一个名为User的类的两个实例。这些对象中的每一个都有自己的DataSet,SQLiteConnection,SQLiteDataAdapter等。我正在尝试模拟学校工作中的“丢失更新”异常。

数据库表如下所示:

ID    Name     Salary
---------------------
1     John     10

在构建User个对象时填充数据集。每个对象都更新同一行。第一个对象将行ID 1的工资增加2,结果为12.第二个对象也将工资增加5,结果为15,但是我们预期17,或者至少是异常,因此回滚事务。但没有例外。我做错了什么?

以下是我在User

中的更新代码
public bool IncreaseSalary(int raise) 
{
    int currentSalary = Convert.ToInt32(_dataSet.Tables["Employees"].
        Rows[0]["Salary"]);
    _dataSet.Tables["Employees"].Rows[0]["Salary"] = currentSalary + raise;

    _connection.Open();
    SQLiteTransaction transaction = _connection.BeginTransaction();
    _employeesDataAdapter.SelectCommand.Transaction = transaction;
    _employeesDataAdapter.UpdateCommand.Transaction = transaction;
    _employeesDataAdapter.DeleteCommand.Transaction = transaction;
    _employeesDataAdapter.InsertCommand.Transaction = transaction;

    int result = _employeesDataAdapter.Update(_dataSet);

    transaction.Commit();

    _dataSet.Clear();
    _employeesDataAdapter.Fill(_dataSet);

    return result > 0;
}

1 个答案:

答案 0 :(得分:0)

您可以使用 Optimistic Concurrency 。指定UpdateCommand以用于检查原始值的位置,以防其他人更改原始值。一个例子:

...
myAdapter.UpdateCommand = new SQLiteCommand("UPDATE Dept SET DeptNo = :DeptNo, DName = :DName WHERE DeptNo = :oldDeptNo", sqConnection); 
myAdapter.UpdateCommand.Parameters.Add("DeptNo", SQLiteType.Int32, 0, "DeptNo"); 
myAdapter.UpdateCommand.Parameters.Add("oldDeptNo", SQLiteType.Int32, 0, "DeptNo").SourceVersion = DataRowVersion.Original;
...

调用更新后,请检查受影响的记录数;如果没有,那么它是丢失的更新