2010-01-16 67 views
14

Estoy desarrollando una pequeña aplicación de escritorio usando C# .NET y MS-Access. No tengo ninguna experiencia previa de MS-Access. Quiero saber si podemos usar transacciones en Ms-Access o no.¿Tenemos transacciones en MS-Access?

Tengo la situación mencionada a continuación.

Insertar en Tbl1
Insertar en TBL2

Quiero insertar en TBL2 sólo cuando inserción en tbl1 tiene éxito. Y si hay alguna excepción durante la inserción en tbl2, quiero deshacer la inserción en tbl1.
Sé que esto se puede lograr fácilmente en el servidor sql, pero en el caso de ms-access, ¿cómo debo gestionar esto. Por favor ayuda, gracias de antemano.

+1

Algunas notas sobre las transacciones de acceso: http://stackoverflow.com/questions/1987696/rollback-multiple-sql-update-queries -in-MS-Access/1987718 # 1987718 – Fionnuala

+1

Access no tiene transacciones, porque Access no es un motor de base de datos. Jet/ACE (motor de base por defecto de acceso) ha apoyado a cometer/rollback, siempre y cuando lo he usado (ya 2.x Jet, por ejemplo, 1996). Nunca ha apoyado el registro de transacciones y probablemente nunca será (I reconocer que no es lo que estás preguntando, pero muchos de los que vienen a Jet/ACE desde un servidor de bases de datos orígenes son bastante niebla en el significado del término "transacciones" y tener un disco tiempo comprendiendo que Jet/ACE admite uno y no el otro). –

Respuesta

9

Parece que hacemos: MSDN - TRANSACTION Statement (Microsoft Access SQL)

Las transacciones no se inician automáticamente. Para iniciar una transacción, debe hacerlo explícitamente usando:

BEGIN TRANSACTION 

cerrar una transacción por la comisión de todo el trabajo realizado durante la transacción:

COMMIT [TRANSACTION | WORK] 

cerrar una transacción retrotrayendo todo el trabajo realizado durante la transacción :

ROLLBACK [TRANSACTION | WORK] 
+0

Está bien, así que Access 2007 lo admite, pero ¿qué pasa con Access 2003? – leeand00

+4

comienzan transacción, confirmar y deshacer son soportadas por el motor a reacción, por lo que si se utiliza un archivo .mdb a través de chorro (llamada de ADO en un programa) que puede ser Access97 o [email protected] leeand00 –

1

Sí Microsoft Access es compatible con Transacciones y funcionan bastante bien. Construí una aplicación POS comercial utilizando Access como mi base de datos hace varios años, y el soporte de transacciones funcionó muy bien.

Aun así, si es posible, usaría SQL Server Express. Es gratis y mucho más poderoso que Access.

+0

Hubiera usado sqlserver, pero mi cliente requiere ejecutar esta aplicación usando un pendrive. Plug and play directo. Él no quiere instalar ningún software en su PC. –

+3

SQL Server Compact Edition se puede integrar como Access, mientras se comporta como SQL Server, albet con algunas características no disponibles. – David

+0

ok, eso sería genial para mi aplicación. Quiere decir que no tengo que instalar ningún componente de .net en la pc del cliente. (excepto .net framework) –

13

En realidad nadie le ha dado ningún ejemplo de código aquí en la respuesta o incluso citó un ejemplo (los archivos de ayuda de acceso sí incluyen ejemplos, sin embargo). La cuestión clave a tener en cuenta es que en Jet/ACE (Access no admite transacciones en sí, depende del motor de base de datos que utilice para eso) que la transacción se controla en el nivel del espacio de trabajo. Puede crear un nuevo espacio de trabajo para su transacción o crear uno nuevo. He aquí algunos ejemplos de código:

On Error GoTo errHandler 
    Dim wrk As DAO.Workspace 
    Dim db As DAO.Database 
    Dim lngInvoiceID As Long 

    Set wrk = DBEngine.Workspaces(0) 
    Set db = wrk.OpenDatabase(CurrentDb.Name) 
    With wrk 
     .BeginTrans 
     db.Execute "INSERT INTO tblInvoice (CustomerID) VALUES (123);", dbFailOnError 
     lngInvoiceID = db.OpenRecordset("SELECT @@IDENTITY")(0) 
     db.Execute "INSERT INTO tblInvoiceDetail (InvoiceID) VALUES (" & lngInvoiceID & ")", dbFailOnError 
     .CommitTrans 
     Debug.Print "Inserted Invoice header and detail for Invoice " & lngInvoiceID 
    End With 

    exitRoutine: 
    If Not (db Is Nothing) Then 
     db.Close 
     Set db = Nothing 
    End If 
    Set wrk = Nothing 
    Exit Sub 

    errHandler: 
    MsgBox Err.Number & ": " & Err.Description, vbExclamation, "Error in transaction" 
    wrk.Rollback 
    Resume exitRoutine 

(código probado y trabajando dentro de Access)

+0

¿En qué versión (s) de acceso funciona esto? – leeand00