SQL数据库中的DBConcurrencyException

时间:2011-05-18 11:53:14

标签: c# sql database

大家好,

最近我开始了一个需要大量数据的项目。实际上它不能存储在运行时内存中。 我一直在寻找这个问题的解决方案,并选择使用SQL数据库。 我找到了一个教程,解释了它们如何工作并自己重新创建。它通过使用dataAdapter更新数据库来确保您的物理数据库和虚拟数据集保持同步;

(仅供参考,教程可以在这里找到:http://www.homeandlearn.co.uk/csharp/csharp_s12p1.html);

然而,在扩展教程时,我遇到了一个错误,我无法解释:DBConcurrencyException。

当我运行程序时,所有功能都有效,我可以添加一行并删除一行。但是当我尝试在同一个执行中执行这两个操作(order = add然后删除)时,错误就出现了。 它描述了一个预期记录中的零个被DeleteCommand影响。

以下代码snippits是我使用的:

初​​始化:

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

先谢谢大家!

1 个答案:

答案 0 :(得分:0)

我遇到了这个问题语句,同时寻找一种方法来阻止SQL Server锁定整个记录(我希望它通过字段/列值锁定),并注意到没有答案给定,所以如果有其他人遇到这个问题,那么就去吧:

OP并没有真正提出问题,只说明了问题所在;所以,这里没有提出问题的答案&#34;如何防止数据库并发冲突?&#34;:

数据库并发冲突(在本例中)可以通过决定哪些数据进入数据库来防止。大多数人选择采取“胜利”的方法。因此,在使用TableAdapter处理操作时,将Update放在Try / Catch中,在Catch for DBConcurrencyException期间,只需确保快速填充,然后更改您应该更改的内容,然后执行更新。每次都有效。