近日,客户在使用软件过程中反映,在添加一条新客户记录后,存盘时,系统给出一个“系统无法处理的异常”的错误提示,无法保存该条记录。
  根据客户的反馈,经过长达数小时的跟踪和确认,终于将问题定位在OleDataAdapter的Update()方法上,并得到Debug提示“违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条”。
  并且,该问题仅出现在下列情况中:
  1.登录后,只添加一条空记录(而不是连续添加多条空记录,然后再一一修改),发现记录编号从0开始;
  2.经过查询操作,查到一个空表(没有查到任何满足条件的记录),然后立刻添加一条新记录,发现记录编号从0开始;

  上网搜索到一些解决办法,但无一奏效。基本上搜索结果定位为下列三点:

  1 检查是否设有主键。
  2 DeleteCommand的问题:检查是否含有自动编号字段(Access的自动编号字段可能会引发此异常);
  3 UpdateCommand的问题:检查更新的字段的原始值是否为空值(原始空值更新时可能会引发此异常)。

  首先,我的后台数据库客户信息表的确设置了主键,因此排除1;
  其次,客户需求说明中并无删除功能,因此DeleteCommand对象行同虚设,从未被调用过,因此排除2,可是,对自动编号的解释比较符合我的猜测;
  最后一条,关于空值的解释,由于我是用了混合编码,数据库DataSet对象是IDE自动产生的,已经充分屏蔽掉了该问题,所以,也不太符合现有程序的出错条件。

  终于,在跟踪UpdateCommand过程中,确定该问题出在UpdateCommand的CommandText属性上,该属性经过替换参数后,WHERE条件为 ID = 0 。查看数据库的客户信息表,ID字段为自动编号字段,但并没有指定种子编号的数字(Access中未找到指定该数值的设置),并且,实际编号是从1开始的。到此,终于确定了问题的真正原因:
  我在添加一条记录的时候,首先存储了这条空记录,而这条空记录的真实编号(ID)一定是大于0的,在数据表格中出现的编号却每次都从0开始(在上述2中报错的情况),在编程实现自动化替换过程中,将UpdateCommand命令的编号替换成了0,造成提交时更新操作失败(根本不存在编号为0的记录),Debug提示:“违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条”。
  找到了问题的原因,开始着手解决:
  首先,考虑如何找到真实的记录编号。根据数据库中的编号与表格中编号不一致,可以推断,表格控件会自动按自己的初始设置,为新增加的记录分配记录编号,并且,该记录编号没有在提交添加记录事务后,与数据库的记录编号进行同步。那么,下面就是找到这个初始设置(编号种子),在每次添加新记录之前,人工来做新记录编号分配工作(同步记录编号)。在系统自动生成的DataSet的客户信息表(DataTable)下面,“编号Column”对象的属性 AutoIncrementSeed就是用来设置该编号种子的,该属性初值被设置为0,这正是前面两种添加记录的情况所导致的问题的根源。
  
  接下来,创建一个GetNewID方法,该方法在每次添加操作之前,取得数据库“客户信息表”的最大编号,然后增加1,并将该值设置到 DataTable的“编号Column”对象的AutoIncrementSeed属性。这样,每次添加之前,系统都回取到最新的编号,存盘后,系统自动存储到数据库的编号自然与取到的编号是同步更新的,就不会出现“违反并发性”的错误了。

  为了搞清如此简单的问题,我付出了6个小时的代价,其中,被强力折磨4个小时。不过,还是非常值得的,因为,网络上居然没找到一个能将该问题解答清楚的,他奶奶的!

后记:我也在开发过程中遇到了这个问题,试着用文章中的方法解决未遂,后来一气之下删除自动编号字段,另用其它字段为主键手工生成ID,终于解决该问题,浪费了很多时间

转载于:https://blog.51cto.com/ddkangfu/175765

Access自动编号 违反并发性原因解析相关推荐

  1. access自动编号怎么解除_access自动编号的方法

    access 自动编号的方法 我们为大家收集整理了关于 access 自动编号,以方便大家参考.如何在 Access 中重置 " 自动编号 " 字段值.在 Access 中删除某个 ...

  2. access自动编号怎么解除_ACCESS自动编号如何恢复从1开始的方法

    最近不少网友问我ACCESS自动编号如何恢复从1开始的方法,我以前在BLOG里也写过一篇这样的文章,现在就把它再转载到这里. 重置单个表中的"自动编号"字段:要重置"自动 ...

  3. SQL SERVER 2000数据库,转换为ACCESS数据库(已解决ACCESS自动编号问题)

    第一步:打开你的"开始菜单",打开"程序"->SQL server enterprise mananger "企业管理器"  在你要导 ...

  4. ACCESS自动编号清零

    ACCESS的数据库,当每次删除所有记录后,表里的一个ID字段(自动编号),无限递增,位数无限扩.当每次执行删除查询时,程序就把"自动编号"型ID字段清零,然后重新从"初 ...

  5. access自动编号怎么解除_【转】Access中如何设置自动编号字段?

    SQL Server 2005中设计表时和在SQL Server Management Studio Express中如何得到自动编号字段呢?本文我们主要就介绍这部分内容,希望能够对您有所帮助. 具体 ...

  6. access自动编号怎么解除_如何在 Access 中重置“自动编号”字段值

    如何在 Access 中重置"自动编号"字段值 中删除某个表中的一些行或所有行时,"自动编号"字段不会自动重置.要重置"自动编号"字段值并 ...

  7. access自动编号怎么解除_Access字段中“自动编号”类型不能再改回来的解决方法...

    从MYSQL数据库导出数据到ACCESS,在修改数据库字段类型时,遇到了"自动编号"无法改回来的情况,把其它类型改为自动编号,就会跳出 在表中输入了数据之后,则不能将任何字段数据类 ...

  8. access 报表中序号自动_Access怎样设置自动编号从1开始排序

    方法一: 删个那个自动编号的字段,再建一个同样的自动编号字段即可. 方法二: 自动编号是一直增加的(每次都加1),你再增加一条记录它的编号会在前面的基础上加1(删除的也算),如果你编号为1的记录被删除 ...

  9. 回滚机制_【巨杉数据库SequoiaDB】巨杉 Tech | 并发性与锁机制解析与实践

    01 概述 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.加锁 ...

最新文章

  1. uboot环境变量-带分号的环境变量
  2. 《自然》深度:中国AI能在2030年制霸世界吗?
  3. 零基础入门学习python
  4. 【公开课预告】:白板与开源
  5. C++ vector,STL vector
  6. masql redis
  7. 最新PHP自动化发卡网源码
  8. mysql绿盟扫描_绿盟软件扫描到存储的安全隐患处理措施
  9. PHP+Redis实现高并发
  10. 钉钉如何群里定时发送文件_简单好用的钉钉群消息助手
  11. 微信小程序中引入iconfont阿里矢量图库
  12. 流程图软件Visio的使用笔记
  13. IOS开发之制作静态库
  14. Redux中的reducer到底是什么,以及它为什么叫reducer?
  15. 【蓝桥杯】基础练习 十六进制转八进制
  16. 【Knowledge】Apex callout 与外部service的统合
  17. 临时记录一次ic卡破解(1)
  18. 访问图片资源403问题
  19. 在一个笼子里同事养着一些鸡和兔子,你想了解有多少只鸡和兔,主任对你说:我只告诉你鸡和兔的总头数是16和总脚数是40,你能不能自己计算有多少只鸡和多少只兔?
  20. 修身修心的1000+篇文章总结

热门文章

  1. win7 64安装oracle10g 客户端,关于win7 64位 只 安装 oracle 10g的client
  2. python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...
  3. 了解下C# 基本语法
  4. JSP笔记-文件上传
  5. c语言进位程序,c语言中如何做带进位位移
  6. 创建模板_UG中如何创建属于自己的编程模板界面?
  7. android wsdl封装,在Android中调用C#写的WebService(附源代码)
  8. HDU1527(博弈论)
  9. Codeforces1600数学[CodeForces - 958E1[平面几何+暴力]CodeForces - 888D [组合数+错排问题]]
  10. python编程快速上手-----让繁琐工作自动化_Python编程快速上手—让繁琐工作自动化|百度云盘|基础学习...