2010-04-07 1 views
9

Есть ли способ рассказать, используя только объект ADODB.Connection, независимо от того, участвует ли он в транзакции или нет?VB6 ADO Connection - как проверить, есть ли в транзакции?

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

ответ

9

Метод 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 
+1

Я подумал о вариантах первого метода, по существу, обертывая ADODB.Connection в новом MyConnection, который добавит эту и другие функции. Хотел свести к минимуму изменения существующего кода, если это возможно. Второй вариант отвечает на мой вопрос, я полагаю, но мне кажется очень рискованным, на самом деле я не хочу взаимодействовать с базой данных каждый раз, когда проверяю ... Спасибо за предложения! –

+1

Упаковка с собственным классом связи может иметь некоторые другие преимущества. Если вам когда-либо понадобится обновиться до VB.net, может быть проще, если вы завернули все объекты ADO в свои собственные объекты. Вы могли бы заставить их иметь аналогичные подписи к ADO (чтобы свести к минимуму изменения существующего кода), но только раскрывать минимальную функциональность, чтобы ограничить объем усилий по обновлению. Я бы предложил разместить их в DLL-проекте, поэтому основной проект даже не ссылается на ADO. Полное раскрытие: мы не сделали это полностью в наших собственных проектах, но я бы хотел, чтобы мы это сделали. – MarkJ

+0

Если только наш механизм отчетов использовал обертку вокруг 'ADODB.Connection'! Я попытался свести к минимуму изменения в существующем коде извлечения извлечения, чтобы пользователи могли запускать отчеты по беспроводному соединению (которое в нашем случае проходит через собственный сервер RPC). –

0

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

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

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

+1

Я не думаю, что вы Можно. Это было первое, что я посмотрел, и похоже, что государственные ценности не имеют ничего сказать о том, чтобы быть в транзакции или нет. См. Http://msdn.microsoft.com/en-us/library/ms675546%28v=VS.85%29.aspx –

0

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

2

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

SELECT @@TRANCOUNT 
+0

Мне нравится этот ответ! dim rstc, tc set rstc = adoCon.Execute ("SELECT @@ TRANCOUNT") tc = CLng (rstc.Fields (0)) –