【问题标题】:Why does DLookup not return the values updated during a transaction?为什么 DLookup 不返回事务期间更新的值?
【发布时间】:2020-07-17 04:47:08
【问题描述】:

我在我的 MS Access VBA 代码中使用事务。我更新了我的一个字段,即 Inventory 表中的 Incoming_Pieces 字段。然后,在提交事务之前,我在更新的字段上使用DLookupDLookup 函数将返回事务前的值,而不是提交前事务期间更新的值。

这是故意的吗?没有错误消息或任何警告表明我正在检索的数据与事务中正在更新的数据不同步。

是生成SELECT 语句而不是DLookup 的唯一解决方法吗?

这是我的测试代码来证明这一点。

Public Function testTransaction()

    Dim pieces As Variant
    pieces = DLookup("Incoming_Pieces", "Inventory", "Code='MT-1-1000x1x1'")
    Debug.Print (pieces)    ' <------------ prints 0
    
    DAO.DBEngine.BeginTrans
    
    Dim sql As String
    sql = "UPDATE Inventory SET Incoming_Pieces = 10 WHERE Code='MT-1-1000x1x1'"
    CurrentDb.Execute (sql)
    pieces = DLookup("Incoming_Pieces", "Inventory", "Code='MT-1-1000x1x1'")
    Debug.Print (pieces)    ' <------------ prints 0

    DAO.DBEngine.CommitTrans

    pieces = DLookup("Incoming_Pieces", "Inventory", "Code='MT-1-1000x1x1'")
    Debug.Print (pieces)    ' <------------ prints 10
    
End Function

【问题讨论】:

  • 显然这是设计使然。您是否验证 SELECT 返回更新的值?为什么你甚至需要 UPDATE 动作?你为什么不只是做交易记录的数据输入?
  • 是的 SELECT 确实返回了更新后的值。这只是示例代码。在我真正的解决方案中。我有几个需要在事务中运行的 SQL 语句。事务中的第 5 个查询取决于第一个查询更新的值。 VBA 中的逻辑要多得多,因此无法通过一个查询全部完成。

标签: vba ms-access transactions dlookup


【解决方案1】:

DLookUp在应用范围内执行,而BeginTrans只影响数据库引擎范围,而且只影响DAO。

在查询中,我们可以区分 2 个作用域:

  1. 应用程序。这些查询可以使用用户定义的函数,并且可以引用基于表单的参数(例如WHERE MyField = Forms!SomeForm!SomeControl)。
  2. 数据库引擎(DAO/ODBC/Others):这些查询不能引用应用程序中发生的任何事情,因此不能使用 VBA 中定义的函数或基于表单的参数,但如果连接/他们操作的工作空间从一个开始。

如果我们想查询事务中发生的事情,我们需要在同一个范围内。这意味着您需要重写 DLookUp 才能使用记录集。

pieces = CurrentDb.OpenRecordset("SELECT Incoming_Pieces FROM Inventory WHERE Code='MT-1-1000x1x1'")(0).Value

一个更简单的例子来证明这一点:

DAO.DBEngine.BeginTrans
CurrentDb.Execute "INSERT INTO Table1(Field1) VALUES(1)"
Debug.Print CurrentDb.OpenRecordset("SELECT COUNT(*) FROM Table1")(0) 'Prints 1 assuming the table was empty
Debug.Print DCount("*", "Table1") 'Prints 0
DAO.DBEngine.Rollback

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 2016-01-19
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多