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