日期:2014-05-18  浏览次数:21114 次

违反并发性: UpdateCommand 影响了预期1 条记录中的0 条(暂时只有20分了,赚分后加,见谅)
在做一个表格的添加与更新,发现添加记录保存没问题,编辑已有记录后保存也没问题
但是如果编辑新添加的记录则报错:
  违反并发性: UpdateCommand 影响了预期1 条记录中的0 条

数据结构如下:
SQL code

create table tb_POLine (
   POLineID             int                  identity,
   POID                 int                  not null,
   GoodsID              int                  not null,
   Qty                  int                  not null,
   LineDesc             vchar(128)           null,
   constraint PK_TB_POLINE primary key (POLineID)
)



呈现表格代码如下:
C# code

if (LineFlag == "Edit")
{
      //根据ID查询明细记录
      DTLine = GetDT(QryStr);      //得到四列,与下面相同
}
else
{
      //给空DataTable添加四列,用于接受输入
      DTLine.Columns.Add("POLineID", typeof(int));
      DTLine.Columns.Add("GoodsID", typeof(int));
      DTLine.Columns.Add("Qty", typeof(int));
      DTLine.Columns.Add("LineDesc", typeof(string));
}

this.gridLine.DataSource = DTLine;



保存表格代码如下:
C# code

//定义POID列
DataColumn poidcol = new DataColumn();
poidcol.ColumnName = "POID";
poidcol.DataType = typeof(int);
poidcol.DefaultValue = GetPOID();   //根据单号得到其ID

添加POID列,并保存
DTLine.Columns.Add(poidcol);
CSQL.UPdt(SaveLineStr, DTLine);     //包含五列

//删除POID列,同步数据
DTLine.Columns.Remove(poidcol);
DTLine.AcceptChanges();




我跟踪了da.update()生成的SQL语句:
添加一条GoodsID为5,Qty为6的记录
SQL code

exec sp_executesql N'INSERT INTO [tb_POLine] ([POID], [GoodsID], [Qty], [LineDesc]) VALUES (@p1, @p2, @p3, @p4)',N'@p1 int,@p2 int,@p3 int,@p4 varchar(8000)',@p1=12,@p2=5,@p3=6,@p4=NULL



马上修改数量为8
SQL code

exec sp_executesql N'UPDATE [tb_POLine] SET [Qty] = @p1 WHERE (([POLineID] = @p2) AND ([POID] = @p3) AND ([GoodsID] = @p4) AND ([Qty] = @p5) AND ((@p6 = 1 AND [LineDesc] IS NULL) OR ([LineDesc] = @p7)))',N'@p1 int,@p2 int,@p3 int,@p4 int,@p5 int,@p6 int,@p7 varchar(8000)',@p1=8,@p2=NULL,@p3=12,@p4=5,@p5=6,@p6=1,@p7=NULL


这里程序报上面提到的错,请注意@p2=NULL这里,在添加记录时POLineID是自动产生的,但是它没有反映到当前的DTLine里来,所以更新出错。

不知我分析的对不对,解决的办法之一就是如何让保存后把数据库产生的POLineID同步到当前DTLine里来,但是我不知道要如何做。
或者还有其它什么更好的办法。

------解决方案--------------------
吱~~~~

保存后再读取数据表重新绑定就行了
------解决方案--------------------
添加后马上保存,然后再编辑。
------解决方案--------------------
检查是否设有主键。 
adapter实现数据更新
UpdateCommand的问题:检查更新的字段的原始值是否为空值(原始空值更新时可能会引发此异常)
int型设置为 0
http://topic.csdn.net/u/20090522/10/ab65adb0-059b-48f0-9623-014af8ba10c4.html