Toon posts:

[Access/VB] Transactions

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een applicatie in Access. Voor sommige handelingen is het noodzakelijk dat er meedere query's uitgevierd worden. Die query's roep ik dan gewoon allemaal aan vanuit VB. Punt is echter dat of AL de query's uitgevoerd moeten worden, of allemaal niet.

Normaal zou je denken dat je dan van al die query's een transactie maakt. transacties moeten immers ACID zijn, dus dat zou het hele probleem oplossen. Helaas kan ik in Access help, en op MSDN weinig vinden over transacties binnenn Access...

Dus, als iemand wat meer weet?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Ik geloof wel dat je in Access met transacties kunt werken, ik weet alleen niet zo direct hoe je dat in VB moet aanroepen.... Heeft het object waarmee je uw connectie legt met de db geen methods ala 'BeginTransaction' of 'StartTransaction' en 'Commit' enz...

PS: waarom staat er 'stored procedures' in jouw topic title?

https://fgheysels.github.io/


Verwijderd

In vb gebruik je ado waarschijnlijk voor je database connectivity, je ado connection object heeft de begintran rollback/commit methods als het goed is.

  • 3volution
  • Registratie: September 2001
  • Niet online

3volution

tsja...

Idd, als je met ADO werkt kun je de BeginTrans etc. van het Connection object gebruiken, als je met DAO werkt kun je de BeginTrans etc. van het Workspace object gebruiken.

Verwijderd

Topicstarter
whoami schreef op 10 september 2002 @ 14:13:
PS: waarom staat er 'stored procedures' in jouw topic title?
Hmmm, dat komt omdat ik vandaag m'n koffie nog niet op heb :)

(lees, dat mag dus weg :> )

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Titel gemod. :Y)

https://fgheysels.github.io/


Verwijderd

Topicstarter
Hmmm...

Ik gebruik op dit moment gewoon DAO. De query's zijn databaseopbjecten die met een DoCmd.OpenQuery gestart worden. Neem aan dat dit gewoon in de standaard workspace gebeurt?!?

/me is een koning in pure sql, maar op dit moment nog maar een prinsje op het gebied van Access en VBA :P

edit:
Thnx whoami!

Verwijderd

Als je het DoCmd object gebruikt, gebruik je geen DAO maar het Access object.
Je zou dit eigenlijk niet moeten doen.
Beter is om het zaakje om te zetten naar ADO.
Ten eerste is dit veel stabieler, en ten tweede (in principe) database onafhankelijk.

/Edit:
Waarschijnlijk bedoel je met 'VB' in je titel: VBA. Je bouwt alles in Access, ipv een Access database en een VB client.

In dat geval zou je kunnen werken met:
DBEngine.BeginTrans

Verwijderd

Topicstarter
Met stabiliteit momenteel geen problemen. Daarnaast zullen er nooit meer dan 4 concurrent users bezig zijn met de DB. Op welk vlak zouden die stabiliteitsproblemen zich dan voor gaan doen?

Database onafhankelijkheid is momenteel niet aan de orde (helaas). Ik ben bang dat ik alles in Access zal moeten blijven doen.

Verwijderd

Of als compleet stukje code:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub RunQueries()
On Error GoTo RunQueries_Err

    Dim oDB As Database
    Dim oWS As Workspace
    
    Set oDB = CurrentDb
    Set oWS = DBEngine.Workspaces(0)
    
    oWS.BeginTrans
    oDB.Execute "Query1"
    oDB.Execute "Query2"
    oDB.Execute "Query3"
    oDB.Execute "Query4"
    
RunQueries_Exit:
    oWS.CommitTrans
    Exit Sub
    
RunQueries_Err:
    oWS.Rollback
    Resume RunQueries_Exit
End Sub

Verwijderd

Topicstarter
Verwijderd schreef op 10 september 2002 @ 16:17:
Of als compleet stukje code:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub RunQueries()
On Error GoTo RunQueries_Err

    Dim oDB As Database
    Dim oWS As Workspace
    
    Set oDB = CurrentDb
    Set oWS = DBEngine.Workspaces(0)
    
    oWS.BeginTrans
    oDB.Execute "Query1"
    oDB.Execute "Query2"
    oDB.Execute "Query3"
    oDB.Execute "Query4"
    
RunQueries_Exit:
    oWS.CommitTrans
    Exit Sub
    
RunQueries_Err:
    oWS.Rollback
    Resume RunQueries_Exit
End Sub
Kijk! Om m'n hele code te herschrijven is nog wat overenthousiast, maar de stukken waar er eigenlijk transactions nodig zijn kan ik dit wel even toepassen.

Thnx!

[edit]
Dit gaat helemaal goedkomen!

Even tussendoor, ik neem aan dat dit gewoon goed samengaat met de andere manier van query's aanroepen (via Access)

Verwijderd

Jawel, dat gaat goed samen.
Bovenstaande code gebruik je vooral bij append, delete, etc queries (action queries). Volgens mij heeft Access zelfs de .Execute method gerestrict tot alleen Action Queries (maar ik kan me vergissen natuurlijk. Volgens mij is een Rollback op bijv. een snapshot vrij zinloos).

Verwijderd

Topicstarter
Verwijderd schreef op 11 september 2002 @ 09:49:
Jawel, dat gaat goed samen.
Bovenstaande code gebruik je vooral bij append, delete, etc queries (action queries). Volgens mij heeft Access zelfs de .Execute method gerestrict tot alleen Action Queries (maar ik kan me vergissen natuurlijk. Volgens mij is een Rollback op bijv. een snapshot vrij zinloos).
Klopt, Execute kan je alleen bij actiequeries toepassen. De stukken code waar slechts een query aangeroepen wordt laat ik mooi met DoCmd lopen, de stukken waar transacties van toepassing zijn krijgen bovenstaande behandeling!

Verwijderd

Zelf heb ik deze functie voor action queries:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Sub ExecuteQuery(strQuery As String)
On Error GoTo Error_ExecuteQuery
  Dim db As Database, qdf As QueryDef, prm As Parameter
  Dim wrk As Workspace, bInTrans As Boolean
  
  Set db = CurrentDb
  Set wrk = DBEngine.Workspaces(0)  'De default workspace
  
  'Start a transaction
  wrk.BeginTrans
  bInTrans = True
  
  'Execute query
  Set qdf = db.QueryDefs(strQuery)
    
  For Each prm In qdf.Parameters
    prm.Value = Eval(prm.Name)
  Next prm
  
  CurrentDb.Execute (strQuery)

  'qdf.Execute dbFailOnError
  
  'End transaction
  wrk.CommitTrans
  bInTrans = False
  
Exit_ExecuteQuery:
  On Error Resume Next
    
  If bInTrans Then
    wrk.Rollback
  End If
  
  Set db = Nothing
  Set wrk = Nothing
  
  Exit Sub

Error_ExecuteQuery:
  
  Resume Exit_ExecuteQuery

End Sub

Zelf vind ik het evallen van de parameters en opruimen van de objecten wel handig :) .
Pagina: 1