ADO Problem mit Transaktionen

23/10/2014 - 13:52 von Wolfgang Wolf | Report spam
Hallo,

ich arbeite hier i.d.R. mit DAO auf einer ODBC-DB. Das funktioniert ganz
pràchtig seit vielen Jahren. Für ein neues Programm habe ich ADO (auch
über ODBC, es gibt keinen OLE_DB-Treiber für meine DB) getestet, um
DB-Abfragen asynchron über einen eigenen Thread laufen zu lassen. Auch
das funktioniert so weit. Probleme habe ich allerdings mit
Transaktionen. Da die Kommunikation mit der Datenbank immer über ODBC
stattfindet, nehme ich an, dass meine Probleme was mit ADO zu tun haben.
Muss zugeben, dass ich ADO bisher stiefmütterlich verwendet habe.

Hier der funktionierende DAO Zugriff:

Dim wrkODBC As DAO.Workspace
Dim db As DAO.Database
Dim rs As ADODB.Recordset

Set wrkODBC = DBEngine.CreateWorkspace("myWSM", user, pwd, dbUseODBC)
Set db = wrkODBC.OpenConnection(db, dbDriverNoPrompt, False)

Set rs = ing_db.OpenRecordset("SELECT...", dbOpenForwardOnly)
rs.close

wrkODBC.BeginTrans
db.Execute "INSERT INTO..."
db.Execute "UPDATE ..."
wrkODBC.CommitTrans


Bei ADO bekomme ich was mit "Mehrfache Recordsets sind bei einer
Transaktion mit diesem Cursortyp nicht möglich. Ändern Sie entweder den
Cursortyp, führen Sie Commit für die Transaktion aus, oder schließen Sie
eines der Recordsets."

Mein ADO-Code sieht in etwa so aus:

Const CN_CONNECTION_STRING As String = "Driver={Ingres};Server=" &
server & ";Database=" & db & ";"
Dim rs As ADODB.Recordset
Dim cn as ADODB.Connection

Set cn = New ADODB.Connection
cn.ConnectionString = CN_CONNECTION_STRING
cn.CursorLocation = adUseClient
cn.open

Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open "SELECT...", cn, adOpenForwardOnly
rs.close

'das hier funktioniert noch:
cn.Execute "INSERT..."

'das nicht mehr:
cn.BeginTrans
cn.Execute "INSERT..." 'hier Fehler
cn.Execute "UPDATE ..."
cn.CommitTrans

Was (alles) mache ich falsch? Der springende Punkt scheint das Recordset
zu sein. Wenn ich nach dem r.close noch ein Set rs = nothing einfüge,
funktioniert das mit den Transaktionen. Sprich, ich darf die Transaktion
nicht starten, wenn das Recordset <> nothing ist. Unter DAO macht das
nichts. Ich kann unter DAO auch innerhalb der Transaktion Recordsets
erzeugen um weitere Daten zu beziehen, ohne dass die Transaktion flöten
geht.

Schönen Gruß
W. Wolf
 

Lesen sie die antworten

#1 Wilfried Dietrich
23/10/2014 - 14:22 | Warnen spam
Hallo Wolfgang,

was passiert, wenn du an Stelle von:
rs.Open "SELECT...", cn, adOpenForwardOnly
rs.Open "SELECT...", cn, adOpenStatic
verwendest?

Wird mit dem RS die gleiche Tabelle geöffnet, die mit
cn.Execute "INSERT..."
bearbeitet wird?

Gruß,
Wilfried

Ähnliche fragen