一个按钮的事件:
{
   My_dataSet.Tables["my_table"].Rows[0].Delete();  //删除第一条记录   My_dataaAdapter.Update(My_dataSet, "my_table");   //update
}单击第一次正常,第二次正常第三次或者第四次总会出现异常:     违反并发性:deletecomand影响了与其中的1条记录中的0条。
什么原因?
  题外话:感觉c#的数据库部分复杂繁琐,又不容易理解。:)个人感觉。

解决方案 »

  1.   

    这是因为更新数据集的时候,前面的记录更新时修改了后面的记录,后面的记录再来更新时,由于数据被改动了,导致出错。
    也就是说读取到脏数据导致的结果。 dataset在更新之后没有做AcceptChange
      

  2.   

    我遇到过!
    在update()方法完成以后;重新加载一下数据就可以了!
    再更新的时候就不会出错了!
      

  3.   

    update()之后是不是要确定下啊?
      

  4.   

    刚才做了一个实验,加上 AcceptChanges(),再update();
    datagridview上面显示删除了,但数据源并没删除,打开后纪录仍存在。
    还有个现象:一个增加记录的按钮:mydatatable.rows.add(newrow);如果加上AcceptChanges(),再update();打开数据源,记录并没增加。什么原因?
      

  5.   

    删除的时候:如果 先update();再AcceptChanges(),结果仍会出现异常。
      

  6.   

    用adapter插入数据的几条关键语句:
    DataRow dr = ds.Tables["ado"].NewRow();
    ds.Tables["ado"].Rows.Add(dr);
    cmd.CommandText = sqlinsert;
    adapter = new SqlDataAdapter(sqlinsert,con);
    adapter.InsertCommand = cmd;
    adapter.Update(ds,"ado");
    用adapter删除数据的关键语句:
    ds.Tables["Dname"].Rows[index].Delete(); //index是选中的要删除的行索引     
    adapter.DeleteCommand = cmd;
    adapter.Update(ds, "Dname");
    我测试过,没问题的。
      

  7.   

    adapter,LZ是不是没搞明白,这种用法如果是想删除或加入一条新纪录的话,ADO.net是由几个基本方法的例如:ExecuteNonQuery()等,就可以了,如果要用adapter,最好在做完一次更新后,重新新建一次adapter对象,保证不要去读脏数据,还有在ADO.net中,合法的select句子是关键,如果select句子不合法,其余的增,删,改全是白瞎。
      

  8.   

    我也在测试阿,我的deletecomand也是配置过的:
           
          string w = "delete from tb1" + " where idt=@idt_v";
                dtAdap.DeleteCommand = new SQLiteCommand(w,conn_m);            SQLiteParameter param_m = null;
                param_m = dtAdap.DeleteCommand.Parameters.Add                ("@idt_v",DbType.Int64);
                param_m.SourceColumn = "idt";
                param_m.SourceVersion = DataRowVersion.Current;
    上面的问题仍旧存在,我现在头都大了,这是数据库操作最基本的东西啊。
      

  9.   

    LZ的例子是在一个点击事件里,如果LZ只在这里面写了那两句的话,adapter对象是个全局的,有可能是不会当每次点击的时候重新建立一个adapter对象的,所以说10楼的代码没问题,但是要放到一块用才行
      

  10.   

    LZ可以查查资料,在没有建立合法的select的时候是不可能有其他的几个操作的,所以说你检查deletecomand是否配对,意义不大,建议仔细看看清华版的微软技术丛书,ADO。NET技术内幕,这个会讲得很清楚的
      

  11.   

    我的adapter是全局的。
    select语句应该没错吧,最简单的:dtAdap = new SQLiteDataAdapter("select * from treetb", conn_m);
      

  12.   

    他在误导你  AcceptChanges()的作用是消除更改标记  而update()恰恰只提交做了更改标记的内容   更改标记是你改动DGV时系统自动打上去的
      

  13.   

    顺序搞反了, Update 后再  AcceptChanges
      

  14.   

    楼上正解,应该先Update后AcceptChanges
      

  15.   

    终于搞定。   原来这两条语句:
     { 
      My_dataSet.Tables["my_table"].Rows[0].Delete();  //删除第一条记录   My_dataaAdapter.Update(My_dataSet, "my_table");  //update 
    }   本身并没有问题。
    也不牵涉acceptechanges(),update()先后,甚至全局adapter。
    问题出在我的数据库的记录上了。
    更换数据记录后,正常了。
    但从众位同学的讨论来看,c#做数据库,不是一般的复杂繁琐阿。