El método BeginTrans se puede utilizar como una función que devuelve el nivel de anidamiento de la transacción. Si crea una propiedad para almacenarla, puede verificarla donde sea necesario para ver si es mayor que 0. Cuando confirma o restituye, deberá disminuir la propiedad usted mismo.
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
También puede adaptar el valor de retorno para trabajar dentro de una función que devuelve Verdadero/Falso si el nivel> 1. No me gusta esto así, pero sería algo parecido a esto (y sin control de errores)
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
He pensado en las variaciones del primer método, esencialmente envolviendo el ADODB.Connection en un nuevo Clase MyConnection que agregaría esto y otras funcionalidades. Quería minimizar los cambios en el código existente si era posible. La segunda forma responde mi pregunta, supongo, pero parece muy arriesgada para mí, en realidad no quiero interactuar con la base de datos cada vez que reviso ... ¡Gracias por las sugerencias! –
Envolver con su propia clase de conexión podría tener otras ventajas. Si alguna vez necesita actualizar a VB.net, podría ser más fácil si ha envuelto todos los objetos ADO en sus propios objetos. Podría hacer que tengan firmas similares a ADO (para minimizar los cambios al código existente) pero solo exponer el mínimo de funcionalidad, para limitar el alcance del esfuerzo de actualización. Sugiero ponerlos en un proyecto DLL para que el proyecto principal ni siquiera haga referencia a ADO. Divulgación completa: no hemos hecho esto completamente en nuestros propios proyectos, pero desearía haberlo hecho. – MarkJ
¡Si nuestro motor de informes utilizara un contenedor alrededor de 'ADODB.Connection'! He jugado con la idea de minimizar los cambios en el código de extracción de informes existente para que los usuarios puedan ejecutar informes a través de una conexión inalámbrica (que en nuestro caso pasa por un servidor RPC personalizado). –