Fehler bei Transaktionen

16/06/2009 - 06:57 von petergarber71 | Report spam
Hallo NG,

Ich bekomme an unten stehender Code-Stelle (Access-ADP) "manchmal"
folgenden Fehler:

"Da der manuelle oder verteilte Transaktionsmodus aktiviert ist, kann
keine neue Verbindung erstellt werden."

Was kann das sein? Evtl. zuvor ausgeführte TRansaktionen werden immer
mit rollback oder commit abgeschlossen.

Set DBConn = CurrentProject.Connection
DBConn.CursorLocation = adUseClient
DBConn.BeginTrans


'Alle offenen Lieferungen selektieren
rsLieferungen.Open "select * from abfLieferungen where idMandant=" &
idMandant & " and idLieferstatus=" & cLieferstatusVorschau & " order
by idBestellung, idLieferung", DBConn, adOpenForwardOnly,
adLockOptimistic

rsHLBuchungen.Open "Select * from tblHlBuchungen where idHLBuchung=0",
DBConn, adOpenForwardOnly, adLockOptimistic

lg
Peter
 

Lesen sie die antworten

#1 Elmar Boye
16/06/2009 - 10:06 | Warnen spam
Hallo Peter,

schrieb ...
Ich bekomme an unten stehender Code-Stelle (Access-ADP) "manchmal"
folgenden Fehler:

"Da der manuelle oder verteilte Transaktionsmodus aktiviert ist, kann
keine neue Verbindung erstellt werden."



Der SQL Server erlaubt nur eine offenes Resultset pro Verbindung
(Solange nicht MARS aktiviert wurde, was bei einer ADP aber nicht
unterstützt wird).

Wenn keine Transaktion begonnen wurde, so eröffnet ADO / OleDb
ggf. im Hintergrund eine weitere Verbindung, solange keine
Transkation aktiv ist. Ist das der Fall wird keine weitere
Verbindung eröffnet und der obige Fehler ausgelöst, da ansonsten
die Datenintegritàt nicht gewàhrleistet ist.

Mehrere gleichzeitige Verbindungen sind aber auch ohne Transaktion
nicht anzuraten, das man sich auf die Weise leicht selbst aussperren
kann - denn jede Verbindung làuft isoliert von den anderen.

Was kann das sein? Evtl. zuvor ausgeführte TRansaktionen werden immer
mit rollback oder commit abgeschlossen.

Set DBConn = CurrentProject.Connection
DBConn.CursorLocation = adUseClient



Das adUseClient ist bei einer ADP Standard also überflüssig.

DBConn.BeginTrans



Du beginnst hiermit eine Transaktion ...

'Alle offenen Lieferungen selektieren
rsLieferungen.Open "..." , DBConn, adOpenForwardOnly, adLockOptimistic
rsHLBuchungen.Open "...", DBConn, adOpenForwardOnly, adLockOptimistic



... und machst dann zwei Recordsets auf (was zu dem Fehler führt).

Wobei Du für die Recordsets im übrigen unsinnige Einstellungen wàhlst.
Denn für adUseClient (ADP Standard) gilt generell adOpenStatic.
http://msdn.microsoft.com/en-us/library/ms677593(VS.85).aspx
Wenn Du wirklich nur lesen willst - was adOpenForwardOnly implizieren
würde -, so wàre adLockReadOnly sinnvoller.
http://msdn.microsoft.com/en-us/library/ms678216(VS.85).aspx

In der der Gesamtheit wird die Ausführung abseits des Fehlers
ziemlich ineffizient.

Da Du schon eine ADP hast, wàre eine bessere Lösung generell
eine Stored Procedure - aber auch dort weniger mit CURSOR
als mit dedizierten SQL Anweisungen zu arbeiten ...
wozu man aber mehr über die zu leistende Arbeit wissen müsste.

Gruß Elmar

Ähnliche fragen