这是我的代码,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)) )

解决方案 »

  1.   

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

  2.   

    可以确定是SqlCommandBuilder自动生成updatecommand出现问题,我用自己写的updatecommand就没有任何问题