违反并发性,DataGridView,DataAdapter,DataSet

(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对应数据库设置自增和默认值,这也是解决方法。

内容纯属记录错误,仅供参考。