VB6 ADO соединение-как проверить, если в транзакции?

есть ли способ сказать, используя только ADODB.Объект соединения, независимо от того, участвует ли он в транзакции в данный момент?

Я хотел бы иметь возможность проверить это на самом объекте connect, не полагаясь на обновление логического рядом с ним.

4 ответов


на BeginTrans метод может использоваться как функция, возвращающая уровень вложенности транзакции. Если вы создаете свойство для хранения этого, вы можете проверить его там, где вам нужно, чтобы увидеть, больше ли он 0. При commit или rollback вам нужно уменьшить объект недвижимости.

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

Если вы подключаетесь к Microsoft SQL Server и можете рассчитывать на его достаточно быстрый ответ (т. е. он не находится на другой стороне планеты), вы можете выполнить запрос:

SELECT @@TRANCOUNT

похоже, вы можете проверить состояние ADO. http://msdn.microsoft.com/en-us/library/ms675068%28v=VS.85%29.aspx

вы, вероятно, уже знаете эту другую часть, но я все равно опубликую ее.

Это объясняет, как транзакции работают с ADO в VB. http://support.microsoft.com/kb/198024


вы не можете, если вы не отслеживаете его самостоятельно. Объект соединения не имеет свойства, связанного с состоянием транзакции. Вы должны будете иметь свой proc установить флаг в другой области таблицы / настроек, Если вы должны иметь его (что может быть проблематично, если происходят необработанные ошибки, и государственный флаг когда-либо "застрял" с недопустимым статусом, вам нужно придумать действительный "тайм-аут" или переопределить, чтобы игнорировать/убивать/перезаписывать предыдущий).