Как получить ObjectContext для компиляции?

Я преобразовываю некоторый код из 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. Кто-нибудь знает, что мне с этим делать?

2 ответа

Решение

SetAbort а также SetComplete методы - это вызовы приложения COM+ (когда-то называвшегося MTS), в котором работает класс, и позволяющего частям кода голосовать за то, будут ли транзакции распределенной базы данных совершаться средой com +. Вы захотите посмотреть путь к коду и посмотреть, требуется ли этот код или нет. Если это так, вы захотите исследовать другие методы расширения транзакций базы данных через несколько обращений к БД. По моему опыту, люди иногда были взволнованы этой технологией и реализовывали ее без необходимости, и вполне возможно, что вы можете просто устранить код.

Самый простой способ дублировать эту функциональность - это поддерживать открытое соединение и соответственно вызывать begintran и endtran, хотя подобные вещи, как правило, усложняются.

Я полагаю, что наиболее близким современным эквивалентом Microsoft является Entity Framework.

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
Другие вопросы по тегам