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 установить флаг в другой области таблицы / настроек, Если вы должны иметь его (что может быть проблематично, если происходят необработанные ошибки, и государственный флаг когда-либо "застрял" с недопустимым статусом, вам нужно придумать действительный "тайм-аут" или переопределить, чтобы игнорировать/убивать/перезаписывать предыдущий).