2008-12-05 69 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

相關問題