VB6 ADO连接 - 如何检查是否处于事务中?

11

仅使用ADODB.Connection对象,有没有办法判断它当前是否参与了事务?

我希望能够在连接对象本身上进行测试,而不依赖于保持旁边的一个布尔值更新。

4个回答

11

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
我考虑过第一种方法的变化,基本上是在一个新的MyConnection类中包装ADODB.Connection,该类将添加此功能和其他功能。如果可能的话,希望尽量减少对现有代码的更改。第二种方法回答了我的问题,但对我来说似乎非常冒险,我实际上不想每次检查时都与数据库交互...感谢您的建议! - Tom Tresansky
1
使用自己的连接类进行封装可能会有其他优点。如果您需要升级到VB.net,如果您已经将所有ADO对象包装在自己的对象中,则可能会更容易。您可以使它们具有与ADO类似的签名(以最小化对现有代码的更改),但仅公开最少的功能,以限制升级工作的范围。我建议将它们放在DLL项目中,这样主项目甚至不引用ADO。完全披露:我们在自己的项目中没有完全做到这一点,但我希望我们能够这样做。 - MarkJ
要是我们的报告引擎能够使用ADODB.Connection的封装就好了!我一直在考虑这个想法,以便最小化对现有报告提取代码的更改,让用户可以通过无线连接运行报告(在我们的情况下,通过自定义RPC服务器进行连接)。 - Mike Spross

2
如果您连接到 Microsoft SQL Server 并且可以保证其响应足够快(即不在地球的另一端),则可以执行以下查询:
SELECT @@TRANCOUNT

我喜欢这个答案! dim rstc, tc set rstc = adoCon.Execute("SELECT @@TRANCOUNT") tc = CLng(rstc.Fields(0)) - Mr AH

0

1
我认为你做不到。这是我第一次查找的地方,看起来状态值似乎没有任何关于是否处于事务中的说明。请参阅:http://msdn.microsoft.com/en-us/library/ms675546%28v=VS.85%29.aspx - Tom Tresansky

0
除非您自己跟踪,否则无法执行此操作。连接对象没有处理事务状态的属性。如果您必须这样做,则必须让您的程序在另一个表/设置区域中设置标志(如果未处理的错误发生并且状态标志永远停留在无效状态,这可能会有问题,您需要提供有效的“超时”或覆盖以忽略/终止/覆盖先前的内容)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接