2010-01-01 15 views
5

tengo varios procedimientos almacenados de SQL (por ejemplo, actualización, seleccione INTO) ejecutados en VBA en MS Access:Revertir actualización SQL varias consultas en MS Access

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

Lo quiero para que:
* si qry2 falla, se va a deshacer qry1.
* qry1 y qry2 se ejecutan al mismo tiempo, (ya que tengo muchos de estos procedimientos almacenados ejecutados en una cadena), por lo que el procedimiento se ejecuta más rápido.

¿Cómo se puede hacer esto?

Respuesta

7

Las transacciones pueden satisfacer, que permiten hacer un rollback: http://msdn.microsoft.com/en-us/library/bb243155.aspx

EDITAR

Aquí es un ejemplo aproximado de 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 

Aquí están algunas notas ásperas para 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

Conozco las transacciones que se usan para los conjuntos de registros. Pero, ¿se pueden usar para declaraciones SQL? –

+0

He agregado algunas notas. – Fionnuala

+0

Gracias. El código solía durar 8 segundos, ahora demora 3 segundos. –