gpt4 book ai didi

c# - ADO.NET 和数据集中的丢失更新

转载 作者:行者123 更新时间:2023-11-30 18:40:38 25 4
gpt4 key购买 nike

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

数据库表如下所示:

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

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

这是我在 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;
}

最佳答案

您可以使用乐观并发。指定要使用的 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;
...

调用更新后,检查有多少条记录受到影响;如果没有,则它是一个丢失的更新

关于c# - ADO.NET 和数据集中的丢失更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7903296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com