2010-01-16 7 views
14

Je développe une petite application de bureau en utilisant C# .NET et MS-Access. Je n'ai aucune expérience antérieure de MS-Access. Je veux savoir si nous pouvons utiliser des transactions dans Ms-Access ou non.Avons-nous des transactions dans MS-Access?

J'ai la situation mentionnée ci-dessous.

Insérer dans Tbl1
Insérer dans TBL2

Je veux insérer dans tbl2 que lorsque l'insertion dans TBL1 est réussie. Et s'il y a une exception lors de l'insertion dans tbl2, je veux annuler l'insertion dans tbl1.
Je sais que cela peut facilement être réalisé en SQL-serveur, mais en cas de ms-accès, Comment dois-je gérer cela. S'il vous plaît, aidez, Merci d'avance.

+1

Quelques notes sur les transactions d'accès: http://stackoverflow.com/questions/1987696/rollback-multiple-sql-update-queries -en-ms-access/1987718 # 1987718 – Fionnuala

+1

L'accès n'a pas de transactions, car Access n'est pas un moteur de base de données. Jet/ACE (le moteur de base de données par défaut d'Access) a pris en charge le commit/rollback tant que je l'ai utilisé (depuis Jet 2.x, par exemple, 1996). Il n'a jamais supporté la journalisation des transactions et ne le fera probablement jamais (je reconnais que ce n'est pas ce que vous demandez mais beaucoup de ceux venant de Jet/ACE à partir des arrière-plans de serveur sont plutôt brumeux sur la signification du terme "transactions" temps à saisir que Jet/ACE supporte l'un et pas l'autre). –

Répondre

9

Il semble que nous faisons: MSDN - TRANSACTION Statement (Microsoft Access SQL)

transactions ne sont pas démarrés automatiquement. Pour démarrer une transaction, vous devez le faire en utilisant explicitement:

BEGIN TRANSACTION 

Conclure une transaction en engageant tous les travaux effectués au cours de la transaction:

COMMIT [TRANSACTION | WORK] 

Conclure une transaction en annulant tous les travaux effectués au cours de la transaction :

ROLLBACK [TRANSACTION | WORK] 
+0

D'accord, Access 2007 le supporte, mais qu'en est-il d'Access 2003? – leeand00

+4

begin transaction, commit et rollback sont pris en charge par le moteur à réaction, donc si vous utilisez un fichier .mdb par jet (appelé depuis ADO dans un programme), il peut être access97 ou supé[email protected] leeand00 –

1

Oui Microsoft Access prend en charge les transactions et elles fonctionnent plutôt bien. J'ai créé une application POS commerciale en utilisant Access comme base de données il y a plusieurs années, et le support des transactions a très bien fonctionné.

Même si, si possible, j'utiliserais SQL Server Express. C'est gratuit et beaucoup plus puissant qu'Access.

+0

J'aurais utilisé sqlserver, mais mon client a besoin d'exécuter cette application en utilisant une clé USB. Direct plug and play. Il ne veut pas installer de logiciel sur son PC. –

+3

SQL Server Compact Edition est intégrable comme Access, tout en se comportant comme SQL Server, avec certaines fonctionnalités indisponibles. – David

+0

okk, ce serait génial pour mon application. Vous voulez dire que je n'ai pas besoin d'installer un composant de .net sur un PC client. (sauf framework .net) –

13

Personne ne vous a donné d'exemple de code ici dans la réponse ou même cité un exemple (les fichiers d'aide d'Access incluent des exemples, cependant). Le problème clé à garder à l'esprit est que dans Jet/ACE (Access ne prend pas en charge les transactions elle-même - cela dépend du moteur de base de données que vous utilisez pour cela) que la transaction est contrôlée au niveau de l'espace de travail. Vous pouvez créer un nouvel espace de travail pour votre transaction ou en créer une nouvelle. Voici quelques exemples de code:

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 

(testé et fonctionnel code dans Access)

+0

Quelle (s) version (s) d'accès est-ce que cela fonctionne? – leeand00

Questions connexes