大家好,
最近我开始了一个需要大量数据的项目。实际上它不能存储在运行时内存中。 我一直在寻找这个问题的解决方案,并选择使用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元素。
先谢谢大家!
答案 0 :(得分:0)
我遇到了这个问题语句,同时寻找一种方法来阻止SQL Server锁定整个记录(我希望它通过字段/列值锁定),并注意到没有答案给定,所以如果有其他人遇到这个问题,那么就去吧:
数据库并发冲突(在本例中)可以通过决定哪些数据进入数据库来防止。大多数人选择采取“胜利”的方法。因此,在使用TableAdapter处理操作时,将Update放在Try / Catch中,在Catch for DBConcurrencyException期间,只需确保快速填充,然后更改您应该更改的内容,然后执行更新。每次都有效。