Метод 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
Я подумал о вариантах первого метода, по существу, обертывая ADODB.Connection в новом MyConnection, который добавит эту и другие функции. Хотел свести к минимуму изменения существующего кода, если это возможно. Второй вариант отвечает на мой вопрос, я полагаю, но мне кажется очень рискованным, на самом деле я не хочу взаимодействовать с базой данных каждый раз, когда проверяю ... Спасибо за предложения! –
Упаковка с собственным классом связи может иметь некоторые другие преимущества. Если вам когда-либо понадобится обновиться до VB.net, может быть проще, если вы завернули все объекты ADO в свои собственные объекты. Вы могли бы заставить их иметь аналогичные подписи к ADO (чтобы свести к минимуму изменения существующего кода), но только раскрывать минимальную функциональность, чтобы ограничить объем усилий по обновлению. Я бы предложил разместить их в DLL-проекте, поэтому основной проект даже не ссылается на ADO. Полное раскрытие: мы не сделали это полностью в наших собственных проектах, но я бы хотел, чтобы мы это сделали. – MarkJ
Если только наш механизм отчетов использовал обертку вокруг 'ADODB.Connection'! Я попытался свести к минимуму изменения в существующем коде извлечения извлечения, чтобы пользователи могли запускать отчеты по беспроводному соединению (которое в нашем случае проходит через собственный сервер RPC). –