2008-12-05 46 views

回答

4

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

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

如果你使用一个交易,你可以回滚。

+0

谢谢你的工作 – tksy 2008-12-05 14:21:04

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") 
3

帕特里克袖口提出这个功能:

Function RowsChanged(updateQuery As String) As Long 
    Dim qry As QueryDef 

    Set qry = CurrentDb.QueryDefs(updateQuery) 
    qry.Execute 

    RowsChanged = qry.RecordsAffected 
    End Function 

我不underst以及为什么在分配QueryDef变量来执行查询时可能会直接执行CurrentDB.Execute而无需初始化(或清除)任何对象变量。

很显然,参数查询需要使用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的全局替换而设计的。

+0

我将上面的代码复制/粘贴到Access 2003中的一个新模块中。当我运行它时,出现“Error in SQLRun(),424:Object required”。对于SQLRun = dbLocal.RecordsAffected。 – 2008-12-10 00:29:08

相关问题