【问题标题】:Getting a value from the update query prompt从更新查询提示中获取值
【发布时间】:2008-12-05 10:17:04
【问题描述】:

当我们运行更新查询时,我们会收到提示说'这些许多记录将被更新。你想继续吗'是否可以将提示消息中的值捕获到变量中,即要更新的记录数。

【问题讨论】:

    标签: vba ms-access


    【解决方案1】:

    如果您从代码运行查询,您可以使用受影响的记录属性:

    Dim db As Database
    Set db=CurrentDB
    db.Execute "Some SQL here"
    db.RecordsAffected
    

    如果使用事务,可以回滚。

    【讨论】:

      【解决方案2】:

      Patrick Cuff 提出了这个功能:

        Function RowsChanged(updateQuery As String) As Long
          Dim qry As QueryDef
      
          Set qry = CurrentDb.QueryDefs(updateQuery)
          qry.Execute
      
          RowsChanged = qry.RecordsAffected
        End Function
      

      我不明白为什么在可以直接执行 CurrentDB.Execute 而不初始化(或清理)任何对象变量的情况下分配 QueryDef 变量来执行查询的麻烦。

      显然,参数查询需要使用 QueryDef 方法,因为您必须在执行之前将值分配给参数。但是没有参数,没有理由让它变得比必要的更复杂。像这样的通用函数没有设置为处理参数查询,它似乎设计错误。

      当然,它还应该使用 dbFailOnError,这样您就不会得到意外的结果(dbFailOnError 与 QueryDef.Execute 一起使用,就像它与 CurrentDB.Execute 一样)。在这种情况下,确实需要一个错误处理程序。

      不是每次执行 SQL 时都编写错误处理程序,而是可以这样做。以下函数返回 RecordsAffected 并将正确地从错误中恢复:

        Public Function SQLRun(strSQL As String) As Long
        On Error GoTo errHandler
          Static db As DAO.Database
      
          If db Is Nothing Then 
             Set db = CurrentDB
          End If
          db.Execute strSQL, dbFailOnError
          SQLRun = db.RecordsAffected
      
        exitRoutine:
          Exit Function
      
        errHandler:
          MsgBox Err.Number & ": " & Err.Description, vbExclamation, "Error in SQLRun()"
          Resume exitRoutine
        End Function
      

      它也可以用来替换 DoCmd.RunSQL(你只需调用它并忽略返回值)。事实上,这个函数完全是为用作 DoCmd.RunSQL 的全局替代品而设计的。

      【讨论】:

      • 我将上面的代码复制/粘贴到 Access 2003 中的一个新模块中。当我运行它时,我得到“SQLRun() 中的错误,424:需要对象。”对于 SQLRun = dbLocal.RecordsAffected。
      • 当我运行 Remou 的解决方案时,我得到的结果是 0 行受影响,但表有 1 行更新。当我运行我的解决方案时,我会更新表格并返回正确的更新行数。
      • 对此感到抱歉——我从一个应用程序中复制了出来,在该应用程序中我使用了一个缓存的数据库变量,该变量通过名为 dbLocal 的函数访问,该函数返回一个数据库对象。我已经修复了代码——只需将 CurrentDB 用于 .Execute 和 .RecordsAffected。既然我已经修复了错误,请撤消否决票。 ;)
      • 要明确一点——您不能使用 CurrentDB 并获取 RecordsAffected,因为对 CurrentDB 的每次调用都会返回一个指向当前打开的数据库的不同指针。我在一月份修改了代码来解决这个问题。
      【解决方案3】:

      是的,您可以通过RecordsAffected 属性获取更新的记录数:

      Function RowsChanged(updateQuery As String) As Long
          Dim qry As QueryDef
      
          Set qry = CurrentDb.QueryDefs(updateQuery)
          qry.Execute
      
          RowsChanged = qry.RecordsAffected
      End Function
      

      您可以使用更新查询的名称调用此函数以获取更新的行数:

      Dim numRows as long
      numRows = RowsChanged("UpdateQuery")
      

      【讨论】:

        猜你喜欢
        • 2015-03-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-08
        • 2018-02-02
        • 2018-05-26
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多