Там какой-либо путь состоит в том, чтобы сказать, с помощью просто объект ADODB.Connection, вовлекается ли он в настоящее время в транзакцию?
Я хотел бы смочь протестировать это на самом объекте подключения, не полагаясь на хранение булевской переменной рядом с обновленным.
Метод BeginTrans может использоваться как функция, которая возвращает уровень вложенности транзакции. Если вы создаете свойство для его хранения, вы можете проверять его в любом месте, чтобы узнать, больше ли оно 0. При фиксации или откате вам нужно будет самостоятельно уменьшить значение свойства.
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
Вы также можете адаптировать возвращаемое значение для работы внутри функции, которая возвращает True / False, если уровень> 1. Мне это тоже не нравится, но это будет выглядеть примерно так (без обработки ошибок)
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
Похоже, вы можете проверить состояние ADO. http://msdn.microsoft.com/en-us/library/ms675068%28v=VS.85%29.aspx
Вы, вероятно, уже знаете эту другую часть, но я все равно опубликую ее.
Здесь объясняется, как транзакции работают с ADO в VB. http://support.microsoft.com/kb/198024
Вы не сможете этого сделать, если сами не отследите это. У объекта подключения нет свойства, связанного с состоянием транзакции. Вам нужно, чтобы ваш процесс установил флаг в другой области таблицы / настроек, если он вам НЕОБХОДИМ (что может быть проблематичным, если возникают необработанные ошибки и флаг состояния когда-либо "застревает" с недопустимым статусом, вам нужно подойти с действительным «тайм-аутом» или переопределением игнорировать / уничтожать / перезаписывать предыдущее).