有没有办法告诉我,只使用ADODB.Connection对象,它是否当前涉及交易?
我希望能够在连接对象本身上测试它,而不依赖于保持旁边的布尔值更新。
答案 0 :(得分:10)
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 :(得分:2)
如果您正在连接到Microsoft SQL Server并且可以指望它足够快地响应(即它不在地球的另一端),您可以执行查询:
SELECT @@TRANCOUNT
答案 2 :(得分:0)
看起来您可以检查ADO状态。 http://msdn.microsoft.com/en-us/library/ms675068%28v=VS.85%29.aspx
你可能已经知道了这个其他部分,但无论如何我都会发布它。
这解释了事务如何在VB中使用ADO。 http://support.microsoft.com/kb/198024
答案 3 :(得分:0)
除非您自己跟踪,否则不能。连接对象没有处理事务状态的属性。你必须让你的proc在另一个表/设置区域设置一个标志,如果你必须拥有它(如果发生未处理的错误并且状态标志被“卡住”无效状态可能会有问题,你需要上来使用有效的“超时”或覆盖来忽略/ kill /覆盖前一个。)