2010-01-01 21 views
5

mam wiele procedur składowanych SQL (np UPDATE, SELECT INTO sprawozdania) realizowane w VBA w MS Access:Rollback zapytań SQL Multiple aktualizacji w MS Access

CurrentDb.Execute "qry1"
CurrentDb.Execute "qry2"

Chcę, aby:
* jeśli qry2 nie powiedzie się, spowoduje cofnięcie qry1.
* qry1 i qry2 są wykonywane w tym samym czasie (ponieważ wiele z tych procedur przechowywanych jest wykonywanych w łańcuchu), więc procedura przebiega szybciej.

Jak można tego dokonać?

Odpowiedz

7

Transakcje mogą pasować, pozwalają one wycofywania: http://msdn.microsoft.com/en-us/library/bb243155.aspx

EDIT

Tutaj jest szorstka przykład w DAO:

Dim strSQL As String 
Dim db As DAO.Database 
Dim wrk As Workspace 

On Error GoTo TrapError 

    Set db = CurrentDb 
    Set wrk = DBEngine.Workspaces(0) 

    wrk.BeginTrans 
     strSQL = "Update sysInfo Set InvoiceOR=False" 
     db.Execute strSQL, dbFailOnError 
    wrk.CommitTrans 

Exit_Sub: 
    Set db = Nothing 
    Set wrk = Nothing 
    Exit Sub 

TrapError: 

    MsgBox "Failed: " & Err.Description 
    wrk.Rollback 
    Err.Clear 
    Resume Exit_Sub 

Oto kilka szorstkie notatek dla ADO:

Dim cmd As ADODB.Command 
Dim cn As ADODB.Connection 

Set cmd = CreateObject("ADODB.Command") 
Set cn = CurrentProject.Connection 

cmd.CommandText = "Update sysInfo Set InvoiceOR=False" 
cmd.ActiveConnection = cn 
cmd.ActiveConnection.BeginTrans 
cmd.Execute , , adExecuteNoRecords 

If Err <> 0 Then 
    cmd.ActiveConnection.RollbackTrans 
Else 
    cmd.ActiveConnection.CommitTrans 
End If 
+0

Jestem świadomy transakcji używanych dla zestawów rekordów. Ale czy można ich użyć do instrukcji SQL? –

+0

Dodałem kilka uwag. – Fionnuala

+0

Dzięki. Kod używał 8 sekund, teraz zajmuje 3 sekundy. –