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 元素。

提前感谢大家!

DBConcurrencyException in SQL Database

在寻找一种防止SQL Server锁定整个记录的方法(我希望它按字段/列值锁定)时,我遇到了这个问题陈述,并注意到没有给出答案,所以如果其他人遇到这个问题,请在这里:

OP 实际上并没有问问题,只是说明了问题所在;所以这里是没有问到的问题的答案"我如何防止数据库并发违规?":

数据库

并发冲突(在这种情况下)可以通过决定哪些数据进入数据库来预防。 大多数人选择采取"最后获胜"的方法。 因此,在使用 TableAdapter 处理操作时,将更新放在 Try/Catch 中,在 DBConcurrencyException 的 Catch 期间,只需确保执行快速填充,然后更改应该更改的任何内容,然后执行更新。 每次都有效。