DBConcurrencyException in SQL Database
本文关键字:Database SQL in DBConcurrencyException | 更新日期: 2023-09-27 17:56:42
大家,
最近我开始了一个需要大量数据的项目。实际上,它不能存储在运行时内存中。我一直在寻找这个问题的解决方案,并选择使用SQL数据库。我找到了一个解释它们如何工作的教程,并自己重新创建了它。它通过使用 dataAdapter 更新数据库来确保您的物理数据库和虚拟数据集保持同步;
(仅供参考,教程可以在这里找到:http://www.homeandlearn.co.uk/csharp/csharp_s12p1.html);
但是,在扩展教程时,我遇到了一个我无法解释的错误,即:DBConcurrencyException。
当我运行程序时,所有功能都可以工作,我可以添加一行和删除一行。但是当我尝试在同一次执行中同时执行这两项操作(顺序=添加然后删除)时,会出现错误。它描述了一个预期记录中的零个受到删除命令的影响。
以下代码截图是我使用的:
初始化:
private void Form1_Load(object sender, EventArgs e)
{
con = new SqlConnection();
ds1 = new DataSet();
con.ConnectionString = "Data Source=.''SQLEXPRESS;AttachDbFilename=C:''<Private>''MyWorkers.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
con.Open();
string sql = "SELECT * From tblWorkers";
da = new SqlDataAdapter(sql, con);
da.Fill(ds1, "Workers");
NavigateRecords();
MaxRows = ds1.Tables["Workers"].Rows.Count;
updateIndicator();
con.Close();
//con.Dispose();
}
(注意:出于隐私原因,我注释掉了目录);
行的添加如下:
private void btnSave_Click(object sender, EventArgs e)
{
SqlCommandBuilder cb = new SqlCommandBuilder(da);
DataRow dRow = ds1.Tables["Workers"].NewRow();
dRow[1] = textBox1.Text;
dRow[2] = textBox2.Text;
dRow[3] = textBox3.Text;
ds1.Tables["Workers"].Rows.Add(dRow);
MaxRows = MaxRows + 1;
inc = MaxRows - 1;
da.Update(ds1, "Workers");
MessageBox.Show("Entry Added");
}
删除行时,将执行以下代码:
private void btnDelete_Click(object sender, EventArgs e)
{
SqlCommandBuilder cb = new SqlCommandBuilder(da);
ds1.Tables["Workers"].Rows[inc].Delete();
MaxRows--;
inc = 0;
NavigateRecords();
da.Update(ds1, "Workers");
MessageBox.Show("Record Deleted");
}
NavigateRecord() 方法和 setIndicator() 方法与此问题无关,因为它们是 GUI 元素。
提前感谢大家!
在寻找一种防止SQL Server锁定整个记录的方法(我希望它按字段/列值锁定)时,我遇到了这个问题陈述,并注意到没有给出答案,所以如果其他人遇到这个问题,请在这里:
OP 实际上并没有问问题,只是说明了问题所在;所以这里是没有问到的问题的答案"我如何防止数据库并发违规?":
数据库并发冲突(在这种情况下)可以通过决定哪些数据进入数据库来预防。 大多数人选择采取"最后获胜"的方法。 因此,在使用 TableAdapter 处理操作时,将更新放在 Try/Catch 中,在 DBConcurrencyException 的 Catch 期间,只需确保执行快速填充,然后更改应该更改的任何内容,然后执行更新。 每次都有效。