jinyuttt

导航

提示:违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条

今天突然遇到这个问题,看了很多总结下。我解决后很郁闷。打算每次情况都不一样的。

1.如果数据库是access,并且有自动编号字段,那么极容易出现错误dataset内的值与数据源不同步,造成无法预期的行为
解决方法: 使用fill方法填充ds.table后,对table建立AutoIncrement = True;AutoIncrementStep = -1;AutoIncrementSeed = 0,这样table以-1递增,不会与数据源冲突
2.如果是SQL,使用Guid字段取代自动递增字段。

3 检查是否设有主键。

4. DeleteCommand的问题:检查是否含有自动编号字段(Access的自动编号字段可能会引发此异常);

   UpdateCommand的问题:检查更新的字段的原始值是否为空值(原始空值更新时可能会引发此异常)。
5.多人并行操作也可能引发这样的异常。

6.如果提交的值超过数据库字段的长度就会引发该异常!

7.

在修改了DataTable中的记录后,用getChanges()方法没有获取到修改的记录,然后保存就没有执行,但是AcceptChanges()却执行了,这个时候DataTable和数据库中的记录实际上就不一致了。在下次执行update的时候,如果这条记录被修改,并且状态是Modified,那么在执行update的时候就会出现这个错误。

问题是,什么时候会修改了记录的内容,但是用GetChanges()却得不到呢,我是把一个字段绑定给了一个TextEdit,在TextEdit修改了内容后,直接就关闭窗体了,这个时候内容修改(1变成2)了,但是记录的状态没有变(还是Unchanged),不知道为什么,估计是控件的问题,所以导致这个错误。

另外说一下,adapter在执行update的时候,是把所有的字段拿去当作where条件,而不是只拿主键,所以会出现只影响了0条的情况。

8.是你更新数据的时候更新了那条记录的关键字,所以在提交更新的时候,update操作找不到相关记录啦

9.http://news.cnblogs.com/question/12108/

至于我今天遇到原因。给大家看看代码就清楚点了。我是修改时出现的,查询,删除,添加都正常。我的配置代码:

oleupdate->CommandText="update gyszl set supplierName=?,address=?,telphone=?,fax=?,credibility=?,commoditysupply=?,intr=? where supplierId=?";
    
    OleDbParameter ^oleupdateParaName=gcnew OleDbParameter("supplierName",OleDbType::VarWChar,50,"supplierName");
    OleDbParameter ^oleupdateParaadress=gcnew OleDbParameter("address",OleDbType::VarWChar,50,"address");
    OleDbParameter ^oleupdateParatph=gcnew OleDbParameter("telphone",OleDbType::VarWChar,50,"telphone");
    OleDbParameter ^oleupdateParafax=gcnew OleDbParameter("fax",OleDbType::VarWChar,50,"fax");
    OleDbParameter ^oleupdateParacrety=gcnew OleDbParameter("credibility",OleDbType::VarWChar,10,"credibility");
    OleDbParameter ^oleupdateParacdsy=gcnew OleDbParameter("commoditysupply",OleDbType::VarWChar,50,"commoditysupply");
    OleDbParameter ^oleupdateParaintr=gcnew OleDbParameter("intr",OleDbType::VarWChar,50,"intr");
                OleDbParameter ^oleupdateParaId=gcnew OleDbParameter("supplierId",OleDbType::Char,10,"supplierId");
    
    oleupdate->Parameters->Add(oleupdateParaId);
    oleupdate->Parameters->Add(oleupdateParaName);
    oleupdate->Parameters->Add(oleupdateParaadress);
    oleupdate->Parameters->Add(oleupdateParafax);
    oleupdate->Parameters->Add(oleupdateParacrety);
    oleupdate->Parameters->Add(oleupdateParacdsy);
    oleupdate->Parameters->Add(oleupdateParatph);
    oleupdate->Parameters->Add(oleupdateParaintr);
    

    parameter=gcnew OleDbParameter();
    parameter->SourceVersion = DataRowVersion::Original;
    oleAdapter->UpdateCommand=oleupdate;

我是这样的代码,就出现了这样的异常,试了上面总结的方法都没有用。最翻书才知道是直接失误了,一眼看过去好像没有任何问题,其实就是这句错了:oleupdate->Parameters->Add(oleupdateParaId);它本来没有错,早上位置放错了,应该放在最后加入即在oleupdate->Parameters->Add(oleupdateParaintr);的后面。因为程序在查找替换“?”是是按照顺序的。我在设置updatecommand时ID为主键放在最后,在加入时也必须放在最后。这主要 是和程序执行有关,我却大意了。感觉真郁闷。还费了我很长时间。这种错误很难查找啊。大家写程序还是要有好习惯,同时在用别人的东西时还是要明白下过程。

最后:也感谢其他网友分享经历和经验!!!!

 

posted on 2010-07-28 15:58  代码苦行僧  阅读(11420)  评论(1编辑  收藏  举报