OLE DB Provider Guide (v11)

COM+ サービスのサポート (OLE DB プロバイダー)

このセクションでは、Pervasive の OLE DB プロバイダーが Microsoft の COM+ サービスとどのように相互作用するかについて説明します。

COM+ サービスとは

COM+(Component Object Model)サービスは Microsoft 固有の技術で、マルチ スレッド コンテキスト内のビジネス オブジェクトを作成するのに使用されます。COM+ は主に Visual Basic プログラマのためにデザインされましたが、それに限定されません。COM+ を使用すると、多階層型アプリケーションを迅速に作成できます。また COM+ は、本来ならば開発者が実装する必要のある多くの利点を備えています。次に COM+ の利点を挙げます。

COM+ の詳細については Microsoft のドキュメントを参照してください。

COM+ サービスは、MTS(Microsoft Transaction Server)によってもたらされる利点の拡張です。MTS は Microsoft の以前のビジネス オブジェクト サーバーの実装です。概して、(Microsoft および Pervasive のドキュメントにある)MTS への参照は、COM+ サービスと置き換えることができます。

Pervasive の OLE DB プロバイダーは COM+ サービスでサポートされます。COM+ サービス内で行われる ADO 呼び出しはその他すべての ADO クライアント呼び出しと同様に動作します。

Visual Basic プログラマのための COM+ サービスの例

Visual Basic プログラマは、MTSTransactionMode プロパティに通じている必要があります。このプロパティを NoTransactions 以外に設定すると、Microsoft トランザクションが起動されます。この機能の詳細については COM+ サービスのマニュアルを参照してください。

次の例は、Microsoft Transaction Server の使い方を示しています。GetObjectContext の呼び出しを成功させるには、MTSTransactionMode プロパティを NoTransactions 以外のどれかに設定する必要があります。Microsoft Transactions を使用すると、Microsoft Transaction Coordinator が 2 フェーズ コミットを行えるようになります。

Public Function UpdatePayroll(employeeID As 
Integer, salary As Currency) 
    On Error GoTo ErrHandler 
    Dim rs As New ADODB.Recordset 
    rs.Index = "employeeID" 
    rs.Open "PayrollTable", 
"Provider=PervasiveOLEDB;Data Source=CompanyDB", 
adOpenDynamic, adLockOptimistic, adCmdTableDirect 
    rs.Seek employeeID, adSeekFirstEQ 
 
    If rs.EOF = True Then 
        GetObjectContext.SetAbort 
    Else 
        rs!salary = salary 
    End If 
    rs.Update 
    rs.Close 
    rs = Nothing 
    GetObjectContext.SetComplete 
Exit Function 
ErrHandler: 
    GetObjectContext.SetAbort 
    If Not IsNull(rs) Then 
        If rs.State = adStateOpen Then 
            rs.Close 
        End If 
    End If 
    rs = Nothing 
End Function 

一方、接続オブジェクトを使用する ADO トランザクションを使って、このビジネス オブジェクトを書き直すことができます。そうすると、MTSTransactionMode プロパティを NoTransactions に設定できるようになります。Microsoft Transactions を使用しなければ、2 フェーズ コミットのオーバーヘッドはなくなります。また、トランザクションをサポートしないオブジェクトはメモリに常駐させることができるのに対し、トランザクションをサポートするオブジェクトは参照されるたびに構築され破壊されます。

Public Function UpdatePayroll(employeeID As 
Integer, salary As Currency) 
    On Error GoTo ErrHandler 
    Dim cn As New Connection 
    Dim rs As New ADODB.Recordset 
     
    cn.Open "Provider=PervasiveOLEDB;Data 
Source=CompanyDB" 
    cn.BeginTrans 
    rs.Index = "employeeID" 
    rs.Open "PayrollTable", cn, adOpenDynamic, 
adLockOptimistic, adCmdTableDirect 
    rs.Seek employeeID, adSeekFirstEQ 
     
    If rs.EOF = True Then 
        cn.RollbackTrans 
    Else 
        rs!salary = salary 
    End If 
    rs.Update 
    rs.Close 
    cn.CommitTrans 
Exit Function 
ErrHandler: 
    cn.RollbackTrans 
    If Not IsNull(rs) Then 
        If rs.State = adStateOpen Then 
            rs.Close 
        End If 
    End If 
End Function 

プログラミング上の注意 (OLE DB プロバイダー)

Execute メソッド(ADO コマンド) (OLE DB プロバイダー)