在数据访问层,我们一般使用DataAdapter来获取或更新数据库数据。很经常地,我们使用CommandBuilder为DataAdapter自动创建InsertCommand、UpdateCommand、DeleteComand。这种方式确实很方便,仅需很少的代码就能完成数据库更新。但使用这种方式有时会产生DBConCurrencyException并发冲突异常。
   
       DataAdapter 检查每次执行的插入、更新或删除操作所影响的行数,如果行数等于零,则引发DBConCurrencyException异常。而实际产生此异常的原因是:使用CommandBuilder为DataAdapter自动创建的更新Command,它们的Where子句包含了相应表结构中的所有字段的比较,就是说,在更新一条记录之前,先通过比较所有的字段而不是仅通过主键的比较来查询这条记录,然后再更新。自从上次获取数据记录之后,如果该数据记录被更新了,那么DataAdapter就会因为找不到该条记录而产生此异常。

一个较简单的解决方法是,设置CommandBuilder的相关属性:ConflictOption和SetAllValues。

  ''' <summary>
    ''' 使用SqlCommandBuilder的数据库更新
    ''' </summary>
    ''' <param name="sqlSelect">用于查询数据的SQL语句,用于设置DataAdapter的SelectCommand</param>
    ''' <param name="dtChanged">包含要更新的数据的DataTable</param>
    ''' <returns>结果更新的行数</returns>
    ''' <remarks></remarks>
    Public Function UpdateDB()Function UpdateDB(ByVal sqlSelect As String, ByVal dtChanged As System.Data.DataTable) As Integer
        Dim daUpdate As SqlDataAdapter = New SqlDataAdapter(sqlSelect, m_dbConnection)     'm_dbConnection:数据库连接

        Dim cmdBuild As SqlCommandBuilder = New SqlCommandBuilder()
         cmdBuild.ConflictOption = ConflictOption.OverwriteChanges   '所有的更新和删除语句仅在 WHERE 子句中包含 PrimaryKey 列
         cmdBuild.SetAllValues = False   'update 语句中仅包含更改的列值
         cmdBuild.DataAdapter = daUpdate
        Try
           
             UpdateDB = daUpdate.Update(dtChanged)
        Catch ex As Exception
            Debug.WriteLine(ex.ToString)
        End Try
         cmdBuild.Dispose()
         daUpdate.Dispose()
    End Function

转载于:https://www.cnblogs.com/forrestsun/archive/2010/09/15/1826864.html

解决DBConCurrencyException并发冲突异常(收藏)相关推荐

  1. 理解和解决Java并发修改异常ConcurrentModificationException(转载)

    原文地址:https://www.jianshu.com/p/f3f6b12330c1 理解和解决Java并发修改异常ConcurrentModificationException 不知读者在Java ...

  2. java 并发修改_理解和解决Java并发修改异常ConcurrentModificationException

    your name.jpg 关键字: Java Exception 不知读者在Java开发的过程中有没有遇到类似的异常信息 Exception in thread "main" j ...

  3. scanf_s 发送访问冲突_程序员如何解决并发冲突的难题?

    作者 | 羽生结弦 责编 | 胡雪蕊 出品 | CSDN(ID: CSDNnews) 在大多数的应用中都会出现客户端同时发送多个请求对同一条数据就行修改,这个时候就会出现并发冲突.我们一般的做法会有如 ...

  4. 程序员如何解决并发冲突的难题?

    作者 | 羽生结弦 责编 | 胡雪蕊 出品 | CSDN(ID: CSDNnews) 在大多数的应用中都会出现客户端同时发送多个请求对同一条数据就行修改,这个时候就会出现并发冲突.我们一般的做法会有如 ...

  5. php 迭代器迭代中文时重复,3种方式解决iterator迭代器并发修改异常

    3种方式解决iterator迭代器并发修改异常ConcurrentModificationException 在使用迭代器的时候,时长会遇到 ConcurrentModificationExcepti ...

  6. Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法

    Java并发--ConcurrentModificationException(并发修改异常)异常原因和解决方法 参考文章: (1)Java并发--ConcurrentModificationExce ...

  7. java sqlite 多线程并发_C#_C#解决SQlite并发异常问题的方法(使用读写锁),本文实例讲述了C#解决SQlite并 - phpStudy...

    C#解决SQlite并发异常问题的方法(使用读写锁) 本文实例讲述了C#解决SQlite并发异常问题的方法.分享给大家供大家参考,具体如下: 使用C#访问sqlite时,常会遇到多线程并发导致SQLI ...

  8. Gox语言中使用读写锁解决并发冲突以及如何实现线程同步归并-GX22

    Gox语言中,除了可以直接使用Go语言中的通道对象(chan)之外,也直接引入了Go语言标准库中的sync包,因此可以直接使用共享锁Mutex对象或者读写锁RWMutex对象来处理并发操作中共享数据安 ...

  9. mysql乐观锁解决并发冲突

    为什么会产生并发冲突? 悲观锁并发性太差 高并发场景用户体验差 实现目标:既要保证用户体验 也要实现数据可靠,乐观锁来解决. 这里有个问题:如果某个时刻只能有一个操作成功,那么其他操作失败怎么办? 前 ...

最新文章

  1. 全链路监控细节和难点剖析!
  2. 再发些CSS常用技巧和兼容方案
  3. JDK的安装与环境变量配置
  4. wxWidgets:使用 wxWidgets 资源文件XRC
  5. [源码研究]Some debugger screenshot of Slf4jLogger creation
  6. 中文版的SAP Cloud for Customer销售订单创建手册
  7. html5 js选择器,使用HTML5的JS选择器操作页面中的元素
  8. 这么香的技术还不快点学起来,不吃透都对不起自己
  9. android 高帧模式,达人分享技巧 手动让安卓机支持王者荣耀高帧率
  10. 考研计算机考试408背诵,今年上岸计算机准研究生分享一下计算机考研(408)经验...
  11. 【物理应用】基于matlab非序贯蒙特卡洛法评估风电系统【含matlab源码 766期】
  12. java程序用户权限管理,java用户管理权限
  13. 机器学习实战练手项目
  14. CROSS APPLY和OUTER APPLY的区别
  15. pytest tox.ini使用
  16. 操作系统-进程甘特图画法
  17. Excel处理 中文转拼音缩写
  18. Forethought Future Cup - Elimination Round G. Zoning Restrictions 最大流(最小割)
  19. 计算算法的时间复杂度
  20. stata学习笔记|离散被解释变量

热门文章

  1. android系统 效率很低,android系统效率低多少?相对于苹果肾的IOS,和WP8来说的话?
  2. ps 抽出工具 抠出头发等细致部分
  3. iPad应用开发实践指南:菜鸟如何用ios 5开发ipad上的复杂应用程序
  4. CSS透明度[简述]
  5. 正面管教之PHP_正面管教家长互助(PHP)体验课1
  6. AD将元器件由正面,放置到反面/元器件由反面放到正面
  7. vue组件名,修改了大小写导致 引入路径~报错
  8. Charles通过Rewrite越过OPTIONS请求拦截
  9. 计算机数学课程标准,小学数学课程标准
  10. UE5 - 后期盒子 全局曝光 亮度调节