VB6 ADO Connection - Как проверить, находится ли в транзакции? - PullRequest
11 голосов
/ 07 апреля 2010

Можно ли как-то сказать, используя только объект ADODB.Connection, участвует ли он в настоящее время в транзакции или нет?

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

Ответы [ 4 ]

10 голосов
/ 08 апреля 2010

Метод 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
2 голосов
/ 27 марта 2013

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

SELECT @@TRANCOUNT
0 голосов
/ 07 апреля 2010

Вы не сможете, если не отследите это сами. У объекта соединения нет свойства, связанного с состоянием транзакции. Вам нужно будет, чтобы ваш процесс установил флаг в другой области таблиц / настроек, если у вас НУЖНО его иметь (что может быть проблематично, если возникают необработанные ошибки и когда флаг состояния «застревает» с недопустимым статусом, вам нужно подойти с допустимым тайм-аутом или переопределением, чтобы игнорировать / убить / перезаписать предыдущий).

0 голосов
/ 07 апреля 2010

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

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

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

...