ACCESS违反并发的原因.docVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ACCESS违反并发的原因

Access自动编号 违反并发性原因解析 标签:.net Access Ado.net 近日,客户在使用软件过程中反映,在添加一条新客户记录后,存盘时,系统给出一个“系统无法处理的异常”的错误提示,无法保存该条记录。   根据客户的反馈,经过长达数小时的跟踪和确认,终于将问题定位在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,终于解决该问题,浪费了很多时间。

文档评论(0)

2017ll + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档