2010-04-07 13 views
9

C'è un modo per dire, usando solo l'oggetto ADODB.Connection, se è o meno attualmente coinvolto in una transazione?VB6 ADO Connection - Come verificare se in Transaction?

Mi piacerebbe essere in grado di testarlo sull'oggetto connect stesso, senza fare affidamento sul mantenimento di un valore booleano accanto ad esso aggiornato.

risposta

9

Il metodo BeginTrans può essere utilizzato come una funzione che restituisce il livello di nidificazione della transazione. Se si crea una proprietà per archiviarla, è possibile controllarla ovunque sia necessario per vedere se è maggiore di 0. Quando si esegue il commit o il rollback è necessario decrementare la proprietà da soli.

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 

Si potrebbe anche adattare il valore di ritorno di lavorare all'interno di una funzione che restituisce True/False se il livello> 1. Non mi piace questo pure, ma sarebbe simile a questa (senza gestione degli errori)

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

Ho pensato a variazioni del primo metodo, essenzialmente avvolgendo ADODB.Connection in un nuovo Classe MyConnection che aggiungerebbe questa e altre funzionalità. Volevo minimizzare le modifiche al codice esistente se possibile. Il secondo modo risponde alla mia domanda, suppongo, ma sembra molto rischioso per me, in realtà non voglio interagire con il database ogni volta che controllo ... Grazie per i suggerimenti! –

+1

Il wrapping con la propria classe di connessione potrebbe avere altri vantaggi. Se hai bisogno di eseguire l'aggiornamento a VB.net, potrebbe essere più semplice se hai avvolto tutti gli oggetti ADO nei tuoi oggetti. Si potrebbe fare in modo che abbiano firme simili all'ADO (per ridurre al minimo le modifiche al codice esistente) ma espongono solo il minimo di funzionalità, per limitare l'ambito dello sforzo di aggiornamento. Suggerirei di inserirli in un progetto DLL in modo che il progetto principale non faccia riferimento nemmeno ADO. Piena divulgazione: non l'abbiamo fatto completamente nei nostri progetti, ma vorrei averlo avuto. – MarkJ

+0

Se solo il nostro motore di reporting utilizzava un wrapper attorno a 'ADODB.Connection'! Mi è venuta l'idea di ridurre al minimo le modifiche al codice di estrazione del report esistente in modo che gli utenti possano eseguire report su una connessione wireless (che nel nostro caso passa attraverso un server RPC personalizzato). –

0

Sembra che sia possibile controllare lo stato ADO. http://msdn.microsoft.com/en-us/library/ms675068%28v=VS.85%29.aspx

Probabilmente già conosci quest'altra parte, ma la pubblicherò comunque.

Questo spiega come le transazioni funzionano con ADO in VB. http://support.microsoft.com/kb/198024

+1

Non ti credo può. Questo è stato il primo posto che ho guardato, e sembra che i valori dello stato non abbiano nulla da dire sull'essere in una transazione o meno. Vedere: http://msdn.microsoft.com/en-us/library/ms675546%28v=VS.85%29.aspx –

0

Non puoi a meno che non lo segui da solo. L'oggetto di connessione non ha una proprietà che si occupa dello stato della transazione. Dovrai fare in modo che il tuo proc assegni un flag in un'altra tabella/area delle impostazioni se DEVI averlo (il che può essere problematico se si verificano errori non gestibili e la flag di stato viene "bloccata" con uno stato non valido, è necessario venire con un "timeout" valido o override per ignorare/kill/sovrascrivere il precedente).

2

Se ci si collega a un Microsoft SQL Server e può contare su di esso per rispondere abbastanza velocemente (cioè non è dall'altra parte del pianeta) è possibile eseguire la query:

SELECT @@TRANCOUNT 
+0

mi piace questa risposta! dim rstc, tc set rstc = adoCon.Execute ("SELECT @@ TRANCOUNT") tc = CLng (rstc.Fields (0)) –