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 连接 - 如何检查是不是在事务中?的主要内容,如果未能解决你的问题,请参考以下文章