MS Access 2010:将事务管理添加到表单中

2024-03-03

使用事务(BeginTrans/CommitTrans/Rollback)后,MS-Access 2010 环境似乎不稳定。我所说的不稳定是指 MS-Access 环境不再允许任何对象修改(它会自动变成一种独占模式),或者在运行进程的任何 SQL 查询时显示意外的错误消息。

情况:

我有一个 MS-Access 2010 数据库(accdb格式),我在其中添加了一个新的 VBA 模块。该模块处理给定文件,以便将其记录加载到数据库的表中。我使用 MS-Access 2010 环境来处理此数据库(不是单独的应用程序)

对于每条记录,在将其存储到数据库之前都会进行一些验证。如果检测到任何错误,所有处理都会被取消。我使用事务来确保完整的文件正常并加载。

Problem:

  1. 如果我第一次运行此进程时它是正确的,因此它以 COMMIT 结束,则可以使用其他文件重新运行该进程,而不管其处理结果如何。每次处理的结果仅取决于文件中数据的质量。

  2. 但是,如果我第一次运行此进程时它会以 ROLLBACK 结束,则该进程的每次下一次运行都会在进程中执行任何 SQL 查询时以错误结束。

在这两种情况下,MS-Access环境都变成一种独占模式。

问题:

这种 VBA 模块或处理是否符合 MS-Access 2010 开发环境?或者我应该构建一个新的单独应用程序来连接到我的 Access 数据库来运行我的文件处理。

代码(简化):

Private Sub Comando0_Click() 'A success processing simulation
    On Error GoTo ErrManagenent

    BeginTrans

    'Some procesing finishin OK
    ProcessWithoutError

    CommitTrans
    Exit Sub

ErrManagenent:

    Debug.Print "Comando0_Click Error: " & Err.Description & "." & vbCrLf & Err.Source

    Rollback
End Sub


Private Sub Comando6_Click() 'A fail processing simulation. 
    On Error GoTo ErrManagenent

    BeginTrans

    'Some procesing finishin with a Err.Raise
    ProcessWithError

    Exit Sub

ErrManagenent:

    Debug.Print "Comando6_Click Error: " & Err.Description & "." & vbCrLf & Err.Source

    Rollback

End Sub


Private Sub ProcessWithError() 'simulation of a process ending with error
    Dim rs As Recordset
    Dim strSql As String

    'Any DB query.
    strSql = "SELECT * FROM 00_Bancos"
    Set rs = CurrentDb.OpenRecordset(strSql)

    Debug.Print rs.RecordCount

    'some processing with
    '......

    'let's suppose there is an error while processing
    rs.Close
    Err.Raise 11, , "MY error mesage"

End Sub


Private Sub ProcessWithoutError() 'Simulation of a process ending OK
    Dim rs As Recordset
    Dim strSql As String

    'Any DB query.
    strSql = "SELECT * FROM 00_Bancos"
    Set rs = CurrentDb.OpenRecordset(strSql)

    Debug.Print rs.RecordCount

    'some processing 
    '......

    'let's suppose the process finishes OK.
    rs.Close

End Sub

仅当您要插入/更新多个 SQL 语句(这对回滚有意义)时,才应使用事务。还可以在 SQL 执行之前使用事务并捕获错误来找出哪个 SQL 语句触发了失败。

pseudo:

  1. 进行验证
  2. 准备SQL语句
  3. 准备SQL语句2
  4. 开始交易
  5. 执行SQL语句
  6. 提交或回滚

在代码中它将是:

Private Sub mTrans()

    Dim myDB As DAO.Database
    Set myDB = CurrentDb

    Dim SQL_SET As String
    SQL_SET = "First sql statement"

    On Error GoTo ERROR_SQL1:
    DBEngine.BeginTrans
        myDB.Execute SQL_SET, dbFailOnError
        On Error GoTo ERROR_SQL2:
        SQL_SET = "second sql statement..." 'either use the same variable or use SQL_SET1 for better overview
        myDB.Execute SQL_SET, dbFailOnError
    DBEngine.CommitTrans

EXIT_SUB:
    On Error Resume Next
    Set myDB = Nothing
    Exit Sub
ERROR_SQL1:
    DBEngine.Rollback
    MsgBox "Error while executing sql_1. " & vbNewLine & "System msg: " & Err.description
    GoTo EXIT_SUB

ERROR_SQL2:
    DBEngine.Rollback
    MsgBox "Error while executing sql_2. " & vbNewLine & "System msg: " & Err.description
    GoTo EXIT_SUB
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MS Access 2010:将事务管理添加到表单中 的相关文章

随机推荐

  • 在 C# 中枚举 Collection 的子集?

    在 C 中是否有一种好方法可以仅枚举 Collection 的子集 也就是说 我有大量对象的集合 例如 1000 个 但我只想枚举元素 250 340 有没有一种好方法可以获取集合子集的枚举器 而无需使用另一个集合 编辑 应该提到这是使用
  • 如何从 Java 7 调用 Kotlin 挂起协程函数

    我正在尝试从 Java 7 调用 Kotlin 函数 我正在使用协程 并且这个被调用的函数正在挂起 例如 suspend fun suspendingFunction Boolean return async longRunningFunc
  • Scala 元组列表到平面列表

    我有元组对列表 List String String 并想将其展平为字符串列表 List String 一些选项可能是 连接 list map t gt t 1 t 2 一个接一个交错 在您发表评论后 您似乎在要求这个 list flatM
  • 计算一系列值的 RGB 值以创建热图

    我正在尝试用 python 创建热图 为此 我必须为可能值范围内的每个值分配一个 RGB 值 我想将颜色从蓝色 最小值 更改为绿色到红色 最大值 下面的图片示例解释了我对颜色组合的看法 我们的范围是从 1 纯蓝色 到 3 纯红色 2 介于两
  • Angular2的ng-select如何实现分组?

    我正在实现多个选择下拉菜单Angular2项目按照这个link https plnkr co edit JcG8uO9nIfSGMEKdLf0Y p preview 但现在我必须在这个多选下拉列表中显示分组 那么我该如何实现呢 或者有其他插
  • Javafx 橡皮筋调整大小错误

    所以 我的橡皮筋课上有一个错误 但我似乎无法修复它 我基本上做的是 我有一个边框窗格 它是我想要调整大小的节点的外部窗格 我为这个 borderpane 指定一个宽度为 1 像素的边框 查看 css 我还为这个边框面板分配了 4 个矩形 每
  • Angular 2 - 锚链接到当前页面上的元素[重复]

    这个问题在这里已经有答案了 如果问题标题不清楚 我有一个带有某些 链接 部分的网页 因此有人可以单击该链接并转到同一模板上的元素 这并不一定意味着更改 URL 我尝试过的要点 a href Section B a a href p Cont
  • 升级到 macOS Sierra 后无法从终端运行 R

    我最近将 MacBook 更新到了 macOS Sierra 版本 10 12 3 16D32 并且我无法再直接从终端运行 R DN51ssqi kjytay R bash R command not found DN51ssqi kjyt
  • ACM 交互器冻结

    我正在尝试使用 Swing 和 ACM 交互器制作一个非常简单的程序 它直接取自课堂讲义 但在我的计算机上不起作用 当我运行它时 它可以正常运行大约半秒 然后短暂闪烁 重新加载 然后所有按钮和文本字段功能都丢失 这是代码 import ac
  • ECONNREFUSED 用于从本地主机到另一个本地主机的代理请求

    首先 我是角度新手 我正在遵循教程视频 https youtu be 2OHbjep WjQ一步步 我在这个问题上被困了近两周 并花了很多时间在其他类似的论坛上寻找解决方案 我意识到这是一个常见的错误 但在尝试了几十个左右的解决方案但没有成
  • 如何捕获整数(0)?

    假设我们有一个语句可以生成integer 0 e g a lt which 1 3 5 捕捉这个最安全的方法是什么 这是 R 打印零长度向量 整数一 的方式 因此您可以测试a长度为 0 R gt length a 1 0 可能值得重新考虑您
  • python 中的图谱聚类

    我想使用谱聚类在 python 中对图进行聚类 谱聚类是一种更通用的技术 不仅可以应用于图形 还可以应用于图像或任何类型的数据 但是 它被认为是一种特殊的技术graph聚类技术 遗憾的是 我无法在线找到 python 中的谱聚类图的示例 S
  • 使用 CSS 制作进度条动画

    所以 我在这个页面上有几个不同的进度条 http kaye at play goals http kaye at play goals 这是我的 HTML 和 CSS div class meter span style width 100
  • jQuery $(window).load(); 是否执行事件不会在没有 声明的页面上触发? (...在 Chrome 扩展内容脚本中)

    我正在开发一个可以操作网页的 Google Chrome 扩展 但在它部分加载 DOM 或完全加载 带有图像 之后 看来现在很多网站都使用 声明 或者它的一些变体 但许多其他人没有 问题主要是关于 HTML 文档类型 我不确定其他的 是否可
  • 在 VBA 中执行存储过程的两种方法,哪一种更好?

    背景 使用前端 Ms Access 2010 和后端 SQL Server 2008 Management Studio 为了执行存储过程 我一直使用一个相当漫长的过程 如下所示 in VBA Set Conn New ADODB conn
  • 如何使用 NSPredicate 过滤包含其他类的复合对象的 NSMutableSet?

    新手问题 我有 3 个类 其中 3 个是 NSOBject 的子类 收藏类 有 2 个属性 masterSong 作为 NSMutableSet 强 非原子 和listOfPlaylists 作为 NSMutableArray 强 非原子
  • 为什么我无法在 python 中处理键盘中断?

    我正在 Windows 上编写 python 2 6 6 代码 如下所示 try dostuff except KeyboardInterrupt print Interrupted except print Some other exce
  • 无法在 OS X (Snow Leopard) 上配置 node.js 进行 make install

    我克隆了 Node git repo 但 Node 附带的 waf 构建工具似乎不适用于最新版本的 Python configure Traceback most recent call last File Users greim node
  • 使用 Spring 具有不同视图的 JPA EntityGraph

    我有一个 Spring 应用程序 登录后 我调用 getUserByEmail 方法 我只需要用户和角色数据 根据角色 我将显示不同的视图 每个视图都有不同的数据 并且需要不同的用户子实体 似乎我必须使用不同的子实体调用 getUserBy
  • MS Access 2010:将事务管理添加到表单中

    使用事务 BeginTrans CommitTrans Rollback 后 MS Access 2010 环境似乎不稳定 我所说的不稳定是指 MS Access 环境不再允许任何对象修改 它会自动变成一种独占模式 或者在运行进程的任何 S