1

我正在将一些代码从 VB6 转换为 VB.Net,它包含许多出现的情况:-

Private m_myobj As ObjectContext

m_myobj = GetObjectContext()
' do stuff, then
m_myobj.SetAbort()
' or
m_myobj.SetComplete()

通过包含对System.Dataand的引用System.Data.EntityImports System.Data.Object我设法编译了声明,但到目前为止,其他人一直拒绝。显示的错误是: -

'GetObjectContext' is not declared. It may be inaccessible due to its protection level
'SetComplete' is not a member of 'System.Data.Objects.ObjectContext'
'SetAbort' is not a member of 'System.Data.Objects.ObjectContext'

从文档中可以看出,这两种方法实际上并不存在,但它们(可能)必须在 VB6 中工作。有谁知道我应该怎么做?

4

2 回答 2

2

SetAbortand方法是对SetComplete运行该类的 COM+(曾经称为 MTS)应用程序的调用,并允许部分代码投票决定分布式数据库事务是否将由 com+ 环境提交。您将需要查看代码路径并查看是否需要该代码。如果是这样,您将需要研究跨多个数据库访问扩展数据库事务的其他方法。以我的经验,人们有时会对这项技术感到兴奋并不必要地实施它,您很可能只需消除代码即可。

复制此功能的最简单方法是保持打开的连接并适当地调用 begintran 和 endtran,但这种东西往往会变得复杂。

我想最接近的现代微软等价物是实体框架。

于 2013-05-01T18:36:01.217 回答
1

GetObjectContext是一个 Windows 函数。您可以像这样使用 P/Invoke 声明它:

<DllImport("ComSvcs.dll", CallingConvention:=CallingConvention.Cdecl)> _
Public Shared Function GetObjectContext(<Out> ByRef pCtx As IObjectContext) As Integer
End Function

<ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("51372AE0-CAE7-11CF-BE81-00AA00A2FA25")> _
Public Interface IObjectContext
    Function CreateInstance(ByVal rclsid As Guid, ByVal riid As Guid) As Object
    Sub SetComplete()
    Sub SetAbort()
    Sub EnableCommit()
    Sub DisableCommit()
    <PreserveSig> _
    Function IsInTransaction() As Boolean
    <PreserveSig> _
    Function IsSecurityEnabled() As Boolean
    Function IsCallerInRole(<MarshalAs(UnmanagedType.BStr)> ByVal role As String) As Boolean
End Interface
于 2013-05-01T16:41:43.833 回答