【发布时间】:2008-12-05 10:17:04
【问题描述】:
当我们运行更新查询时,我们会收到提示说'这些许多记录将被更新。你想继续吗'是否可以将提示消息中的值捕获到变量中,即要更新的记录数。
【问题讨论】:
当我们运行更新查询时,我们会收到提示说'这些许多记录将被更新。你想继续吗'是否可以将提示消息中的值捕获到变量中,即要更新的记录数。
【问题讨论】:
如果您从代码运行查询,您可以使用受影响的记录属性:
Dim db As Database
Set db=CurrentDB
db.Execute "Some SQL here"
db.RecordsAffected
如果使用事务,可以回滚。
【讨论】:
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 的全局替代品而设计的。
【讨论】:
是的,您可以通过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")
【讨论】: