我正在将一些代码从VB6转换为VB.Net,并且它包含许多次出现: -
Private m_myobj As ObjectContext
m_myobj = GetObjectContext()
' do stuff, then
m_myobj.SetAbort()
' or
m_myobj.SetComplete()
通过包含对System.Data
和System.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中运行。有谁知道我该怎么办?
答案 0 :(得分:2)
SetAbort
和SetComplete
方法是调用运行该类的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