如何编译ObjectContext?

时间:2013-05-01 14:32:39

标签: vb.net com vb6-migration

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

Private m_myobj As ObjectContext

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

通过包含对System.DataSystem.Data.Entity以及Imports 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中运行。有谁知道我该怎么办?

2 个答案:

答案 0 :(得分:2)

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

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

我认为最接近的现代微软等同物是实体框架。

答案 1 :(得分: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