2010-01-01 9 views
5

-je avoir plusieurs procédures stockées SQL (par exemple UPDATE SELECT INTO) exécutées dans VBA dans MS Access:Rollback plusieurs requêtes de mise à jour de SQL dans MS Access

CurrentDb.Execute "REQ1"
CurrentDb.Execute "qry2"

Je le veux pour que:
* si qry2 échoue, il va annuler qry1.
* qry1 et qry2 sont exécutés en même temps (comme beaucoup de ces procédures stockées sont exécutées dans une chaîne), la procédure s'exécute plus rapidement.

Comment cela peut-il être fait?

Répondre

7

Transactions peuvent convenir, ils permettent rollback: http://msdn.microsoft.com/en-us/library/bb243155.aspx

EDIT

Voici un exemple grossier dans 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 

Voici quelques notes approximatives pour 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

Je suis conscient des transactions utilisées pour les jeux d'enregistrements. Mais peuvent-ils être utilisés pour les instructions SQL? –

+0

J'ai ajouté quelques notes. – Fionnuala

+0

Merci. Le code utilisé pour prendre 8 secondes, maintenant cela prend 3 secondes. –

Questions connexes