从更新查询提示中获取值

时间:2008-12-05 10:17:04

标签: vba ms-access access-vba

当我们运行更新查询时,我们会得到提示,说'这些记录将会更新。你想继续'是否有可能将提示信息中的值捕获到一个变量,即要更新的记录数。

3 个答案:

答案 0 :(得分:6)

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

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

如果您使用交易,则可以回滚。

答案 1 :(得分:4)

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

我不明白为什么人们会在没有初始化(或清理)任何对象变量的情况下直接在没有初始化(或清理)任何对象变量的情况下直接执行查询来分配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的全局替代。

答案 2 :(得分: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")