Die Methode BeginTrans kann als Funktion verwendet werden, die die Verschachtelungsebene der Transaktion zurückgibt. Wenn Sie eine Eigenschaft zum Speichern erstellen, können Sie sie dort überprüfen, wo sie benötigt wird, um zu sehen, ob sie größer als 0 ist. Wenn Sie ein Commit oder Rollback durchführen, müssen Sie die Eigenschaft selbst dekrementieren.
Private m_TransLevel As Long
Public Property Get TransactionLevel() As Long
TransactionLevel = m_TransLevel
End Property
Public Property Let TransactionLevel(vLevel As Long)
m_TransLevel = vLevel
End Property
Public Sub SaveMyData()
TransactionLevel = adoConnection.BeginTrans()
...
End Sub
Sie könnten auch den Rückgabewert anpassen innerhalb einer Funktion arbeiten, die> True/False, wenn die Ebene 1 zurück ich dies nicht so gut gefallen, aber es würde wie folgt aussehen (ohne Fehlerbehandlung
)
Public Function IsConnectionInsideTransaction(ByVal vADOConnection as ADOBD.Connection) As Boolean
Dim intLevel As Integer
If vADOConnection.State = AdStateOpen Then
intLevel = vADOConnection.BeginTrans()
IsConnectionInsideTransaction = (intLevel > 1)
vADOConnection.RollbackTrans
End If
End Function
Ich habe über Variationen der ersten Methode nachgedacht, im Wesentlichen die ADODB.Connection in einem neuen Wrapping MyConnection-Klasse, die diese und andere Funktionen hinzufügen würde. Wollte Änderungen am bestehenden Code möglichst minimieren. Der zweite Weg beantwortet meine Frage, nehme ich an, scheint aber sehr riskant zu sein, ich möchte eigentlich nicht jedes Mal mit der Datenbank interagieren, wenn ich nachschaue ... Danke für die Vorschläge! –
Das Umhüllen mit Ihrer eigenen Verbindungsklasse könnte einige andere Vorteile haben. Wenn Sie jemals ein Upgrade auf VB.net durchführen müssen, ist es möglicherweise einfacher, wenn Sie alle ADO-Objekte in Ihre eigenen Objekte eingepackt haben. Sie können die ADO mit ähnlichen Signaturen versehen (um Änderungen am vorhandenen Code zu minimieren), jedoch nur ein Minimum an Funktionalität bereitstellen, um den Umfang des Upgrade-Aufwands zu begrenzen. Ich würde vorschlagen, sie in ein DLL-Projekt zu stellen, so dass das Hauptprojekt nicht einmal auf ADO verweist. Volle Offenlegung: Wir haben das nicht komplett in unseren eigenen Projekten gemacht, aber ich wünschte, wir hätten es getan. – MarkJ
Wenn nur unsere Berichts-Engine einen Wrapper für 'ADODB.Connection' verwendet! Ich habe mit der Idee gespielt, Änderungen am vorhandenen Berichtsextraktionscode zu minimieren, sodass Benutzer Berichte über eine drahtlose Verbindung (in unserem Fall über einen benutzerdefinierten RPC-Server) ausführen können. –