|
このセクションでは、Pervasive の OLE DB プロバイダーが Microsoft の 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 プログラマは、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
|