• 提示:违反并发性: 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为主键放在最后,在加入时也必须放在最后。这主要 是和程序执行有关,我却大意了。感觉真郁闷。还费了我很长时间。这种错误很难查找啊。大家写程序还是要有好习惯,同时在用别人的东西时还是要明白下过程。

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

  • 相关阅读:
    53个Python面试问题
    ycsb对hbase性能测试的研究
    zookeeper的安装(图文详解。。。来点击哦!)
    Zookeeper概论(对zookeeper的概论、原理、架构等的理解)
    Hadoop集群搭建安装过程(三)(图文详解---尽情点击!!!)
    Hadoop集群搭建安装过程(二)(图文详解---尽情点击!!!)
    Hadoop集群搭建安装过程(一)(图文详解---尽情点击!!!)
    Linux虚拟机安装(CentOS 6.5,图文详解,需要自查)
    Hive中的排序和分组(对map和reduce的影响,值得一看!)
    HDFS的工作原理(读和写操作)
  • 原文地址:https://www.cnblogs.com/jinyuttt/p/1787111.html
Copyright © 2020-2023  润新知