日期:2014-05-19  浏览次数:20851 次

并发冲突,updatecommand影响0个记录
这是我的代码,updateCommand,insertCommand等是由SqlCommandBuilder自动生成的,在我的表中“货号”是主键,在datagrid中第一次修改时,可以显示修改成功,但第二次修改时“出现并发冲突,updatecommand影响0个记录”的错误。

string   strSQL= "select   货号,条码,拼音编码,品名,单位,进货价,销售价1,销售价2,规格,产地,类别,最低售价   from   商品清单 ";
this.myConnection   =   new   SqlConnection(connectionString);
this.da   =   new   SqlDataAdapter(this.strSQL,this.myConnection);
this.sqlCmdBld   =   new   SqlCommandBuilder(da);
int   row=this.dataGrid1.CurrentCell.RowNumber;
this.dataGrid1.CurrentCell=new   DataGridCell(row+1,0);
if(this.ds.HasChanges())
      {
this.da.Update(changedDataSet,tableName);
MessageBox.Show( "数据修改成功! ", "信息 ");

}
else{


MessageBox.Show( "没有需要修改的数据 ");
return;

}
我利用SqlCommandBuilder的getupdateCommand获得自动生成的updatecommand,查看其中的commandtext为:UPDATE   商品清单   SET   货号   =   @p1   ,   条码   =   @p2   ,   拼音编码   =   @p3   ,   品名   =   @p4   ,   单位   =   @p5   ,   进货价   =   @p6   ,   销售价1   =   @p7   ,   销售价2   =   @p8   ,   规格   =   @p9   ,   产地   =   @p10   ,   类别   =   @p11   ,   最低售价   =   @p12   WHERE   (   (货号   =   @p13)   AND   ((条码   IS   NULL   AND   @p14   IS   NULL)   OR   (条码   =   @p15))   AND   ((拼音编码   IS   NULL   AND   @p16   IS   NULL)   OR   (拼音编码   =   @p17))   AND   ((品名   IS   NULL   AND   @p18   IS   NULL)   OR   (品名   =   @p19))   AND   ((单位   IS   NULL   AND   @p20   IS   NULL)   OR   (单位   =   @p21))   AND   ((进货价   IS   NULL   AND   @p22   IS   NULL)   OR   (进货价   =   @p23))   AND   ((销售价1   IS   NULL   AND   @p24   IS   NULL)   OR   (销售价1   =   @p25))   AND   ((销售价2   IS   NULL   AND   @p26   IS   NULL)   OR   (销售价2   =   @p27))   AND   ((规格   IS   NULL   AND   @p28   IS   NULL)   OR   (规格   =   @p29))   AND   ((产地   IS   NULL   AND   @p30   IS   NULL)   OR   (产地   =   @p31))   AND   ((类别   IS   NULL   AND   @p32   IS   NULL)   OR   (类别   =   @p33))   AND   ((最低售价   IS   NULL   AND   @p34   IS   NULL)   OR   (最低售价   =   @p35))   )

------解决方案--------------------
这种情况,就是主键设定为自增量造成的或其他程序和数据库不对应造成的。

前台、后台必须保持一致。
例如,读取的时候
Id Name
11 A
21 B
客户端生成新的为
22 C
但数据库不一定,也许新增的话,原有ID=22的被删除掉了,就会给你增加23 C
这第一次是不会有错误的,但是同时留下隐患,两者产生了对应偏差
于是下次更新就会产生,客户端Id=22,服务器Id=23,不对应了,就有了并发冲突。