繁体   English   中英

ADO.NET和DataSet中丢失的更新

[英]Lost Update in ADO.NET and DataSets

我有一个名为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;
}

您可以使用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;
...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM