当我们运行更新查询时,我们会得到提示,说'这些记录将会更新。你想继续'是否有可能将提示信息中的值捕获到一个变量,即要更新的记录数。
答案 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")