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 プロバイダー)