[HOWTO] ADO を公開するコンポーネントのバイナリ互換の維持

文書番号:195049
最終更新日:2004年2月3日
リビジョン:4.0
この記事は、以前は次の ID で公開されていました: JP195049

概要

バイナリ互換を使用している Visual Basic のプロジェクトを再コンパイルすると、結果として次のような警告が発生します。
"...モジュールには、バージョン互換コンポーネントでの同じ宣言と互換性のない引数または異なる型の戻り値があります。 ... 元の定義 : Function <関数名> as ADODB.Recordset15 現在の定義: Function <関数名> as ADODB.Recordset ..."
このダイアログ ボックスは互換性の保持と破棄、および戻り値または引数の編集と保存の選択肢を提供します。または、次のエラーが表示されることもあります。
コンパイル エラー : プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。
これらのエラーは、新しいバージョンの ActiveX Data Objects (ADO) でコンパイルされたコンポーネントが Recordset などのオブジェクトを公開し、以前のバージョンの ADO を使用してコンパイルされたコンポーネントとのバイナリ互換を維持しようとしているために発生します。この動作は仕様です。

先頭へ戻る

詳細

Visual Basic コードは "ADODB.Recordset" など、バージョンに依存しない ProgID を使用します。プロジェクトをコンパイルするときに、このバージョンに依存しない ProgID を使用して特定のクラスに対して Class ID を取得します。たとえば ADO 1.5 では、ADO 1.5 のインターフェイス ClsID に、バージョンに依存しない ProgID がマップされます。新しいバージョンの ADO でコンポーネントを再コンパイルすると、バージョンに依存しない ProgID は新しいインターフェイス ClsID にマップするようになります。この例では、ADO と新しいインターフェイスは ADO 1.5 とバイナリ互換でありません。

以前のインターフェイスを必要としているクライアントとのバイナリ互換を設定するには、バージョンを特定して公開する ADO インターフェイスを作成します。

たとえば、関数宣言を次のバージョンに依存しない宣言から
   Function <関数名> as ADODB.Recordset
バージョンを特定した宣言に変更します。
   Function <関数名> as ADODB.[_Recordset15]
メインの ADO オブジェクト、Recordset、Command、および Connection オブジェクトごとに、以前のバージョンを特定する ProgID が公開されています。

バージョンを特定した宣言を指定するには、ADO オブジェクトにバージョン識別子を追加します。
ByVal pRecordset As ADODB.Recordset20
注 : ADO 2.0 では、オブジェクトの前にアンダースコア、後にバージョン識別子を指定し、角かっこで囲みます。

宣言を変更すると、バイナリ互換の警告が表示されずにプロジェクトをコンパイルできます。

次は、以前のバージョンとバイナリ互換を維持しながら、新しいバージョンの ADO に対応するコードを記述するより完全な例です。次の例は、ADO Recordset オブジェクトを返す ADO メソッドです。

この関数が ADO 1.5 でコンパイルされる場合は、ADO 1.5 とのバイナリ互換を維持するために関数宣言を変更する必要があります。
   Public Function ReturnRS(strConnect As String, _
                            strQuery As String) As ADODB.Recordset
       Dim adoCon1 As New ADODB.Connection
       Dim adoRs1 As New ADODB.Recordset

       ' ADORecordset を返すように、CursorLocation にadUseClient を設定します。
       adoCon1.CursorLocation = adUseClient

       ' 接続文字列で渡された ADO Connection を開きます。
       adoCon1.Open strConnect

       ' SQL 文字列で渡された ADO Recordset を開きます。
       adoRs1.Open strQuery, adoCon1, adOpenKeyset, adLockBatchOptimistic

       ' クライアントに ADO Recordset を返します。
       Set ReturnRS = adoRs1

       ' ここでは ADO Recordset は閉じることはできません。
       ' ただし、関連付けは解除します。
       Set adoRs1.ActiveConnection = Nothing

       ' ADO Connection オブジェクトを閉じます。
       adoCon1.Close

   End Function
新しいバージョンの ADO でコンパイルする場合でも ADO 1.5 とのバイナリ互換を維持できるように、ここで同じ関数を変更します。
     Public Function ReturnRS(strConnect As String, _
                         strQuery As String) As ADODB.Recordset15

     ' または、ADO 2.0 では次の構文を使用します。 
     ' Public Function ReturnRS(strConnect As String, _
                         ' strQuery As String) As ADODB.[_Recordset15]
       Dim adoCon1 As New ADODB.Connection
       Dim adoRs1 As New ADODB.Recordset

       ' ADORecordset を返すように、CursorLocation にadUseClient を設定します。
       adoCon1.CursorLocation = adUseClient

       ' 接続文字列で渡された ADO Connection オブジェクトを開きます。
       adoCon1.Open strConnect

       ' SQL 文字列で渡された ADO Recordset を開きます。
       adoRs1.Open strQuery, adoCon1, adOpenKeyset, adLockBatchOptimistic

       ' クライアントにADO Recordset オブジェクトを返します。
       Set ReturnRS = adoRs1

       ' ここでは ADO Recordset は閉じることはできません。
       ' ただし、関連付けは解除します。
       Set adoRs1.ActiveConnection = Nothing

       ' ADO Connection オブジェクトを閉じます。
       adoCon1.Close

   End Function
コンポーネントまたはアプリケーションが以前のインターフェイスしか公開しない場合でも、新しいバージョンの ADO に対してコンパイルしたコンポーネントまたはアプリケーションを正しく実行するには、新しいコンポーネントが必要になります。これは依存関係を持つコンパイルでは一般的なことです。新しいバージョンの依存関係を持つコンポーネントを再コンパイルする場合、新しい依存関係がコンパイルされたコンポーネントの基準になり、コンポーネントと共に新しい依存ファイルを再配布する必要があります。これは Visual Basic のアプリケーションを新しいバージョンの Visual Basic で再コンパイルするのと同じことです。新しい Visual Basic のランタイム .dll をコンパイルしたアプリケーションと共に配布しない場合は、このアプリケーションは実行できません。

Visual Basic のこのインプリメンテーション上の利点は、コードが新しい機能および新しいバージョンの ADO をうまく利用できることです。さらに、以前のインターフェイスを必要としているクライアントとバイナリ互換性を維持できます。

先頭へ戻る

関連情報

旧バージョンの ADO との互換性の維持に関連する情報については、次の文書番号をクリックして Microsoft Knowledge Base を参照してください。
222145 (http://support.microsoft.com/kb/222145/EN-US/) PRB: ADO Data Control Events May Generate a Compilation Error
222145 (http://support.microsoft.com/kb/222145/JA/) [ADO] ADODC のイベントでコンパイル エラーが発生する
バイナリ互換、ProgID と ClsID、および COM の詳細については、次の書籍を参照してください。

『Inside COM』、Dale Rogerson 著、マイクロソフト プレス、1997 年 2 月。

『Inside Distributed COM』、Guy Eddon、Henry Eddon 共著、Microsoft Press、1998 年 8 月。

『Understanding ActiveX and OLE』、David Chappell 著、Microsoft Press、1996 年 9 月。

先頭へ戻る

詳細

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 195049 (http://support.microsoft.com/kb/195049/EN-US/) (最終更新日 2000-10-11) をもとに作成したものです。

先頭へ戻る


この資料は以下の製品について記述したものです。
Microsoft Data Access Components 1.5
Microsoft Data Access Components 2.0
Microsoft Data Access Components 2.1 Service Pack 2
Microsoft Data Access Components 2.5
Microsoft Data Access Components 2.6
Microsoft Visual Basic 5.0 Enterprise Edition
Microsoft Visual Basic 6.0 Enterprise Edition

先頭へ戻る

キーワード: 
kbhowto kbado150 kbado200 kbado210sp2 kbado250 kbado260 kbgrpmdac kbdatabase kbvbp500 kbcmt kbvbp600 kbcompiler kbgrpvbdb KB195049

先頭へ戻る

"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
© 2008 Microsoft Corporation. All rights reserved. Terms of Use |Trademarks |Privacy Statement