VB6 ADO 连接 - 如何检查是不是在事务中?

Posted

技术标签:

【中文标题】VB6 ADO 连接 - 如何检查是不是在事务中?【英文标题】:VB6 ADO Connection - How to Check if in Transaction?VB6 ADO 连接 - 如何检查是否在事务中? 【发布时间】:2011-02-05 06:10:19 【问题描述】:

有什么方法可以判断,仅使用 ADODB.Connection 对象,它当前是否参与事务?

我希望能够在连接对象本身上对此进行测试,而无需依赖更新它旁边的布尔值。

【问题讨论】:

【参考方案1】:

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

您还可以调整返回值以在级别 > 1 时返回 True/False 的函数内工作。我也不喜欢这样,但它看起来像这样(没有错误处理)

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

【讨论】:

我考虑过第一种方法的变体,本质上是将 ADODB.Connection 包装在一个新的 MyConnection 类中,该类将添加此功能和其他功能。如果可能的话,希望尽量减少对现有代码的更改。我想,第二种方式回答了我的问题,但对我来说似乎很冒险,我实际上并不想每次检查时都与数据库进行交互......感谢您的建议! 使用您自己的连接类进行包装可能还有其他一些优势。如果您需要升级到 VB.net,如果您将所有 ADO 对象包装在您自己的对象中,可能会更容易。您可以使它们具有与 ADO 相似的签名(以最大限度地减少对现有代码的更改),但只公开最少的功能,以限制升级工作的范围。我建议将它们放在一个 DLL 项目中,这样主项目甚至不引用 ADO。全面披露:我们还没有在自己的项目中完全做到这一点,但我希望我们做到了。 如果我们的报告引擎使用ADODB.Connection 的包装器就好了!我已经考虑过尽量减少对现有报告提取代码的更改,以便用户可以通过无线连接(在我们的例子中通过自定义 RPC 服务器)运行报告。【参考方案2】:

如果您连接到 Microsoft SQL Server 并且可以指望它足够快地响应(即它不在地球的另一端),您可以执行查询:

SELECT @@TRANCOUNT

【讨论】:

我喜欢这个答案! dim rstc, tc set rstc = adoCon.Execute("SELECT @@TRANCOUNT") tc = CLng(rstc.Fields(0))【参考方案3】:

看起来您可以检查 ADO 状态。 http://msdn.microsoft.com/en-us/library/ms675068%28v=VS.85%29.aspx

您可能已经知道其他部分,但我还是会发布它。

这解释了事务如何在 VB 中与 ADO 一起工作。 http://support.microsoft.com/kb/198024

【讨论】:

我不认为你可以。这是我看的第一个地方,看起来状态值对是否参与交易没有任何意义。见:msdn.microsoft.com/en-us/library/ms675546%28v=VS.85%29.aspx【参考方案4】:

除非你自己跟踪它,否则你不能。连接对象没有处理事务状态的属性。如果您必须拥有它,您必须让您的 proc 在另一个表/设置区域中设置一个标志(如果发生未处理的错误并且状态标志曾经“卡住”无效状态,这可能会出现问题,您需要上来具有有效的“超时”或覆盖以忽略/杀死/覆盖前一个)。

【讨论】:

以上是关于VB6 ADO 连接 - 如何检查是不是在事务中?的主要内容,如果未能解决你的问题,请参考以下文章

VB6 - DAO - 存储过程

用于 TLS1.2 的 VB6 应用程序 ado 连接

如何保护Vb6应用程序和mssql服务器之间的连接?

让 VB6 ADO 应用程序在 Windows 7 中工作

求vb6.0与SQL数据库连接的教程或资料,你行的话也可以直接帮帮我QQ313505846

C#:通过 ADO.NET 在 SQL Server 2008 上运行事务