2010-04-07 8 views

Antwort

9

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 
+1

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! –

+1

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

+0

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. –

0

Es sieht so aus, als ob Sie den ADO-Status überprüfen können. http://msdn.microsoft.com/en-us/library/ms675068%28v=VS.85%29.aspx

Sie kennen diesen Teil wahrscheinlich schon, aber ich poste ihn trotzdem.

Dies erklärt, wie die Transaktionen mit ADO in VB arbeiten. http://support.microsoft.com/kb/198024

+1

Ich glaube nicht, Sie kann. Dies war der erste Ort, an dem ich nachgesehen habe, und es sieht so aus, als ob die staatlichen Werte nichts über eine Transaktion aussagen oder nicht. Siehe: http://msdn.microsoft.com/en-us/library/ms675546%28v=VS.85%29.aspx –

0

Sie können nicht, wenn Sie es selbst verfolgen. Das Verbindungsobjekt hat keine Eigenschaft, die den Transaktionszustand betrifft. Sie müssen Ihr Proc in einem anderen Tabellen-/Einstellungsbereich ein Flag gesetzt haben, wenn Sie es haben müssen (was problematisch sein kann, wenn unbehandelte Fehler auftreten und das Zustandsflag jemals mit einem ungültigen Status "hängenbleibt", müssen Sie auftauchen mit einem gültigen "Timeout" oder Override zum Ignorieren/Kill/Überschreiben des vorherigen).

2

Wenn Sie auf einem Microsoft SQL Server sich verbinden und auf sie verlassen kann schnell genug zu reagieren (dh es ist nicht auf der anderen Seite des Planeten) können Sie die Abfrage ausführen können:

SELECT @@TRANCOUNT 
+0

ich mag diese antwort! dim rstc, tc set rstc = adoCon.Execute ("AUSWAHL @@ TRANCOUNT") tc = CLng (rstc.Fields (0)) –

Verwandte Themen