(C#)‘违反并发’错误记录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | private void DataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) { //打印出修改后的dataset //StringWriter sw = new StringWriter(); //ds.Tables[0].WriteXml(sw); //Console.WriteLine(sw.ToString()); MySqlCommandBuilder commandBuilder = new MySqlCommandBuilder(mySqlDataAdapter); mySqlDataAdapter.UpdateCommand = commandBuilder.GetUpdateCommand(); mySqlDataAdapter.InsertCommand = commandBuilder.GetInsertCommand(); mySqlDataAdapter.DeleteCommand = commandBuilder.GetDeleteCommand(); try { this.Validate(); bindingSource1.EndEdit(); if(ds.GetChanges() != null) { mySqlDataAdapter.Update(ds.Tables["student"]); ds.AcceptChanges(); //ds.Clear(); //mySqlDataAdapter.Fill(ds, "student");//在修改新插入一条记录会报‘违反并发性’的错误,通过生成新的dataset得以解决,原因是因为数据库采用主键自增长或默认值,导致内存和数据库的数据不一致!!! } } catch (Exception ex) { MessageBox.Show(ex.Message, "修改失败"); } } |
报错了,‘违反并发性’,呵呵,有趣。百度了一下,全是什么没有设置主键,笑了,都是一样的答案。
放弃百度,自己找问题。
'违反并发性’哪里违反呢?
反复测试发现在添加新记录并修改时会引发错误!错误问题找到了,那好办了!
为什么会这样呢?经过排查,发现是主键自增和设置默认值的问题,准确的说是由于在填加新数据时数据库也在操作(自增默认值),导致数据库数据和内存中的DataSet的数据不一致导致。
好了,解决了。不一致是吧,
1 2 | ds.Clear(); mySqlDataAdapter.Fill(ds, "student"); |
重新将数据库的数据添加到DataSet对象中,这不就一致了?
1 2 3 | ds.Tables[0].Columns[0].AutoIncrement = true; ds.Tables[0].Columns[0].AutoIncrementSeed = 1; ds.Tables[0].PrimaryKey = new DataColumn[] { ds.Tables[0].Columns[0] }; |
或者将DataTable对应数据库设置自增和默认值,这也是解决方法。
内容纯属记录错误,仅供参考。