2010-01-16 19 views
14

Sto sviluppando una piccola applicazione desktop utilizzando C# .NET e MS-Access. Non ho alcuna esperienza precedente di MS-Access. Voglio sapere se possiamo usare le transazioni in Ms-Access o no.Abbiamo transazioni in MS-Access?

Ho la seguente situazione.

Inserire in Tbl1
Inserire in TBL2

voglio inserire in tbl2 solo quando l'inserimento in tbl1 è successo. E se c'è qualche eccezione durante l'inserimento in tbl2, voglio eseguire il rollback dell'inserimento in tbl1.
So che questo può essere facilmente raggiunto in sql-server, ma in caso di accesso ms, come dovrei gestirlo. Si prega di aiuto, grazie in anticipo.

+1

Alcune note sulle operazioni di accesso: http://stackoverflow.com/questions/1987696/rollback-multiple-sql-update-queries -in-ms-access/1987718 # 1987718 – Fionnuala

+1

L'accesso non ha transazioni, perché l'accesso non è un motore di database. Jet/ACE (il motore db predefinito di Access) ha supportato il commit/rollback finché l'ho usato (da Jet 2.x, ad es. 1996). Non ha mai supportato la registrazione delle transazioni e probabilmente non lo farà mai (riconosco che non è quello che stai chiedendo ma molti di quelli che arrivano a Jet/ACE dagli sfondi dei database dei server sono piuttosto nebulosi sul significato del termine "transazioni" e hanno un duro tempo a capire che Jet/ACE supporta uno e non l'altro). –

risposta

9

sembra che facciamo: MSDN - TRANSACTION Statement (Microsoft Access SQL)

Le transazioni non vengono avviati automaticamente. Per avviare una transazione, è necessario farlo in modo esplicito utilizzando:

BEGIN TRANSACTION 

concludere un affare impegnandosi tutti i lavori eseguiti durante la transazione:

COMMIT [TRANSACTION | WORK] 

concludere un affare da rollback tutti i lavori eseguiti durante la transazione :

ROLLBACK [TRANSACTION | WORK] 
+0

Va bene Access 2007 supporta, ma per quanto riguarda Access 2003? – leeand00

+4

inizio transazione, commit e rollback sono supportati dal motore di rotazione, quindi se si utilizza un file .mdb tramite jet (chiamato da ADO in un programma) può essere access97 o [email protected] leeand00 –

1

Sì Microsoft Access supporta Transactions e funzionano abbastanza bene. Ho creato un'applicazione POS commerciale utilizzando Access come database diversi anni fa e il supporto delle transazioni ha funzionato molto bene.

Anche così, se possibile, userei SQL Server Express. È gratuito e molto più potente di Access.

+0

Avrei usato sqlserver, ma il mio client richiede di eseguire questa applicazione utilizzando una pendrive. Plug and play diretto. Non vuole installare alcun software sul suo PC. –

+3

SQL Server Compact Edition è incorporabile come Access, pur continuando a comportarsi come SQL Server, albet con alcune funzionalità non disponibili. – David

+0

ok, sarebbe perfetto per la mia applicazione. Vuoi dire che non devo installare alcun componente di .net sul PC client. (eccetto .net framework) –

13

Nessuno ti ha fornito alcun esempio di codice qui nella risposta o ha citato un esempio (i file di aiuto di Access includono anche degli esempi). Il problema chiave da tenere presente è che in Jet/ACE (l'accesso non supporta le transazioni stesse - dipende da quale motore di database si sta utilizzando per quello) che la transazione è controllata a livello di spazio di lavoro. È possibile creare un nuovo spazio di lavoro per la transazione o crearne uno nuovo. Ecco alcuni esempi di codice:

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 

(codice testato e di lavoro all'interno Access)

+0

In che versione di accesso funziona? – leeand00