Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - プログラミング » SQL Anywhere の配備 » データベースとアプリケーションの配備 » クライアント・アプリケーションの配備 » OLE DB クライアントと ADO クライアントの配備

 

OLE DB プロバイダのカスタマイズ

OLE DB プロバイダをインストールする場合は、Windows レジストリの変更が必要です。通常、変更には OLE DB プロバイダに組み込まれている自己登録機能を使用します。たとえば、Windows regsvr32 ツールを使用することができます。レジストリ・エントリの標準セットは、プロバイダによって作成されます。

一般的な接続文字列では、コンポーネントの 1 つは Provider 属性になります。SQL Anywhere OLE DB プロバイダを使用することを示すには、プロバイダの名前を指定します。次に Visual Basic の場合の例を示します。

connectString = "Provider=SAOLEDB;DSN=SQL Anywhere 11 Demo"

ADO か OLE DB または両方を使用する場合には、プロバイダを名前で参照する方法が数多く存在します。次に示すのは C++ の例で、プロバイダ名の他に使用バージョンも指定しています。

hr = db.Open(_T("SAOLEDB.11"), &dbinit);

プロバイダ名は、レジストリで検索されます。使用コンピュータ・システムのレジストリを確認すると、HKEY_CLASSES_ROOT に SAOLEDB のエントリが見つかります。

[HKEY_CLASSES_ROOT\SAOLEDB]
@="SQL Anywhere OLE DB Provider"

そこには、プロバイダに対して 2 つのサブキーがあり、クラス識別子 (ClsId) と現在のバージョン (CurVer) が指定されています。次に例を示します。

[HKEY_CLASSES_ROOT\SAOLEDB\Clsid]
@="{41dfe9f3-db91-11d2-8c43-006008d26a6f}"

[HKEY_CLASSES_ROOT\SAOLEDB\CurVer]
@="SAOLEDB.11"

同様のエントリが他にもいくつかあります。これらは、OLE DB プロバイダの特定のインスタンスを識別するために使用されます。レジストリで HKEY_CLASSES_ROOT\CLSID の下の ClsId を探し、そのサブキーを見ると、エントリの 1 つでプロバイダ DLL のロケーションが指定されていることがわかります。

[HKEY_CLASSES_ROOT\CLSID\
{41dfe9f3-db91-11d2-8c43-006008d26a6f}\
InprocServer32]

@="c:\\sa11\\bin64\\dboledb11.dll"
"ThreadingModel"="Both"

ここで問題になるのは、これが融通の利かない構造であることです。SQL Anywhere ソフトウェアをシステムからアンインストールすると、OLE DB プロバイダのエントリがレジストリから削除され、プロバイダ DLL がハード・ドライブから削除されます。これにより、削除するプロバイダに依存しているアプリケーションが動作しなくなります。

同様に、さまざまなベンダ製のアプリケーションが同じ OLE DB プロバイダを使用している場合、そのプロバイダをインストールするたびに、共通レジストリ設定が上書きされます。アプリケーションの動作に必要なプロバイダのバージョンが、別の新しい (または古い) バージョンのプロバイダに置き換わる可能性があります。

このような状況によって不安定な状態が生じるのは望ましくありません。この問題に対応するため、SQL Anywhere OLE DB プロバイダはカスタマイズが可能になっています。

次の演習では、ユニークな GUID セットを生成し、ユニークなプロバイダ名とユニークな DLL 名を選択します。この 3 つの手順を踏むことで、アプリケーションとともに配備できるユニークな OLE DB プロバイダが作成されます。

ここでは、OLE DB プロバイダのカスタム・バージョンを作成する手順を説明します。

♦  OLE DB プロバイダをカスタマイズするには、次の手順に従います。
  1. 後に示すサンプル登録ファイルのコピーを作成します。登録ファイルは非常に長いので、手順の後に示しています。ファイル名には、サフィックスとして .reg を付けます。レジストリ値の名前は大文字と小文字を区別します。

  2. Microsoft Visual Studio の uuidgen ユーティリティを使用して、4 つの連続する UUID (GUID) を作成します。

    uuidgen -n4 -s -x >oledbguids.txt
  3. 4 つの UUID または GUID は、次の順番で割り当てます。

    1. Provider クラス ID (下の表の GUID1)。

    2. Enum クラス ID (下の表の GUID2)。

    3. ErrorLookup クラス ID (下の表の GUID3)。

    4. Provider Assist クラス ID (下の表の GUID4)。最後の GUID は、Windows Mobile の場合の配備では使用されません。

    この 4 つが連番であることが重要です (uuidgen コマンド・ラインで -x を指定することでそのようになります)。各 GUID は次のように表示されるはずです。

    名前 GUID
    GUID1 41dfe9f3-db92-11d2-8c43-006008d26a6f
    GUID2 41dfe9f4-db92-11d2-8c43-006008d26a6f
    GUID3 41dfe9f5-db92-11d2-8c43-006008d26a6f
    GUID4 41dfe9f6-db92-11d2-8c43-006008d26a6f

    増分されているのは GUID の最初の部分です (この例では 41dfe9f3)。

  4. エディタの検索/置換機能を使用して、テキストに出現するすべての GUID1、GUID2、GUID3、GUID4 を対応する GUID に変更します (たとえば、uuidgen によって生成された GUID が上の表のような場合は、GUID1 を 41dfe9f3-db92-11d2-8c43-006008d26a6f に置き換えます)。

  5. Provider 名を決定します。ここで決定する名前を、アプリケーションで接続文字列に使用します (例:Provider=SQLAny)。次の名前は使用しないでください。これらは、SQL Anywhere によって使用されています。

    バージョン 10 以降 バージョン 9 以前
    SAOLEDB ASAProv
    SAErrorLookup ASAErrorLookup
    SAEnum ASAEnum
    SAOLEDBA ASAProvA
  6. エディタの検索/置換機能を使用して、出現するすべての SQLAny という文字列を選択したプロバイダ名に変更します。置換対象には、長い文字列の一部として SQLAny が出現する箇所も含まれます (例:SQLAnyEnum)。

    プロバイダ名を Acme としたとします。この場合に HKEY_CLASSES_ROOT レジストリに表示される名前を、比較しやすいように SQL Anywhere の名前とともに次の表に示します。

    SQL Anywhere プロバイダ カスタム・プロバイダ
    SAOLEDB Acme
    SAErrorLookup AcmeErrorLookup
    SAEnum AcmeEnum
    SAOLEDBA AcmeA
  7. SQL Anywhere プロバイダ DLL (dboledb11.dlldboledba11.dll) のコピーを別の名前で作成します。Windows Mobile の場合、dboledba11.dll はありません。

    copy dboledb11.dll myoledb11.dll
    copy dboledba11.dll myoledba11.dll

    スクリプトにより、選択した DLL 名に基づく特別なレジストリ・キーが作成されます。ここでは、標準の DLL 名 (dboledb11.dlldboledba11.dll など) と名前が異なっていることが重要です。プロバイダ DLL 名を myoledb11 とすると、プロバイダは HKEY_CLASSES_ROOT でこの名前のレジストリ・エントリを探します。プロバイダ・スキーマ支援 DLL の場合も同様です。DLL 名を myoledba11 とすると、プロバイダは HKEY_CLASSES_ROOT でこの名前のレジストリ・エントリを探します。ユニークで、他人から選択されにくい名前にすることが重要です。次にその例を示します。

    選択された DLL 名 対応する HKEY_CLASSES_ROOT\name
    myoledb11.dll HKEY_CLASSES_ROOT\myoledb11
    myoledba11.dll HKEY_CLASSES_ROOT\myoledba11
    acmeOledb.dll HKEY_CLASSES_ROOT\acmeOledb
    acmeOledba.dll HKEY_CLASSES_ROOT\acmeOledba
    SAcustom.dll HKEY_CLASSES_ROOT\SAcustom
    SAcustomA.dll HKEY_CLASSES_ROOT\SAcustomA
  8. エディタの検索/置換機能を使用して、レジストリ・スクリプトに出現するすべての myoledb11myoledba11 を選択した 2 つの DLL 名に変更します。

  9. エディタの検索/置換機能を使用して、レジストリ・スクリプトに出現するすべての d:\\mypath\\bin32\\ を DLL のインストール・ロケーションに変更します。1 つのスラッシュを表すのにスラッシュを 2 つ重ねる必要があることに注意してください。この手順は、アプリケーションのインストール時にカスタマイズが必要です。

  10. レジストリ・スクリプトをディスクに保存して、実行します。

  11. 新しいプロバイダを試します。新しいプロバイダ名を使用するよう ADO または OLE DB アプリケーションを必ず変更してください。

変更するレジストリ・スクリプトを次に示します。

REGEDIT4
; Special registry entries for a private OLE DB provider.

[HKEY_CLASSES_ROOT\myoledb11]
@="Custom SQL Anywhere OLE DB Provider 11.0"

[HKEY_CLASSES_ROOT\myoledb11\Clsid]
@="{GUID1}"

; Data1 of the following GUID must be 3 greater than the
; previous, for example, 41dfe9f3 + 3 => 41dfe9ee.

[HKEY_CLASSES_ROOT\myoledba11]
@="Custom SQL Anywhere OLE DB Provider 11.0"

[HKEY_CLASSES_ROOT\myoledba11\Clsid]
@="{GUID4}" 

; Current version (or version independent prog ID)
; entries (what you get when you have "SQLAny"
; instead of "SQLAny.11")

[HKEY_CLASSES_ROOT\SQLAny]
@="SQL Anywhere OLE DB Provider"

[HKEY_CLASSES_ROOT\SQLAny\Clsid]
@="{GUID1}"

[HKEY_CLASSES_ROOT\SQLAny\CurVer]
@="SQLAny.11"

[HKEY_CLASSES_ROOT\SQLAnyEnum]
@="SQL Anywhere OLE DB Provider Enumerator"

[HKEY_CLASSES_ROOT\SQLAnyEnum\Clsid]
@="{GUID2}"

[HKEY_CLASSES_ROOT\SQLAnyEnum\CurVer]
@="SQLAnyEnum.11"

[HKEY_CLASSES_ROOT\SQLAnyErrorLookup]
@="SQL Anywhere OLE DB Provider Extended Error Support"

[HKEY_CLASSES_ROOT\SQLAnyErrorLookup\Clsid]
@="{GUID3}"

[HKEY_CLASSES_ROOT\SQLAnyErrorLookup\CurVer]
@="SQLAnyErrorLookup.11"

[HKEY_CLASSES_ROOT\SQLAnyA]
@="SQL Anywhere OLE DB Provider Assist"

[HKEY_CLASSES_ROOT\SQLAnyA\Clsid]
@="{GUID4}"

[HKEY_CLASSES_ROOT\SQLAnyA\CurVer]
@="SQLAnyA.11" 

; Standard entries (Provider=SQLAny.11)

[HKEY_CLASSES_ROOT\SQLAny.11]
@="Sybase SQL Anywhere OLE DB Provider 11.0"

[HKEY_CLASSES_ROOT\SQLAny.11\Clsid]
@="{GUID1}"

[HKEY_CLASSES_ROOT\SQLAnyEnum.11]
@="Sybase SQL Anywhere OLE DB Provider Enumerator 11.0"

[HKEY_CLASSES_ROOT\SQLAnyEnum.11\Clsid]
@="{GUID2}"

[HKEY_CLASSES_ROOT\SQLAnyErrorLookup.11]
@="Sybase SQL Anywhere OLE DB Provider Extended Error Support 11.0"

[HKEY_CLASSES_ROOT\SQLAnyErrorLookup.11\Clsid]
@="{GUID3}"

[HKEY_CLASSES_ROOT\SQLAnyA.11]
@="Sybase SQL Anywhere OLE DB Provider Assist 11.0"

[HKEY_CLASSES_ROOT\SQLAnyA.11\Clsid]
@="{GUID4}" 

; SQLAny (Provider=SQLAny.11)

[HKEY_CLASSES_ROOT\CLSID\{GUID1}]
@="SQLAny.11"
"OLEDB_SERVICES"=dword:ffffffff

[HKEY_CLASSES_ROOT\CLSID\{GUID1}\ExtendedErrors]
@="Extended Error Service"

[HKEY_CLASSES_ROOT\CLSID\{GUID1}\ExtendedErrors\{GUID3}]
@="Sybase SQL Anywhere OLE DB Provider Error Lookup"

[HKEY_CLASSES_ROOT\CLSID\{GUID1}\InprocServer32]
@="d:\\mypath\\bin32\\myoledb11.dll"
"ThreadingModel"="Both"

[HKEY_CLASSES_ROOT\CLSID\{GUID1}\OLE DB Provider]
@="Sybase SQL Anywhere OLE DB Provider 11.0"

[HKEY_CLASSES_ROOT\CLSID\{GUID1}\ProgID]
@="SQLAny.11"

[HKEY_CLASSES_ROOT\CLSID\{GUID1}\VersionIndependentProgID]
@="SQLAny" 

; SQLAnyErrorLookup

[HKEY_CLASSES_ROOT\CLSID\{GUID3}]
@="Sybase SQL Anywhere OLE DB Provider Error Lookup 11.0"
@="SQLAnyErrorLookup.11"

[HKEY_CLASSES_ROOT\CLSID\{GUID3}\InprocServer32]
@="d:\\mypath\\bin32\\myoledb11.dll"
"ThreadingModel"="Both"

[HKEY_CLASSES_ROOT\CLSID\{GUID3}\ProgID]
@="SQLAnyErrorLookup.11"

[HKEY_CLASSES_ROOT\CLSID\{GUID3}\VersionIndependentProgID]
@="SQLAnyErrorLookup" 

; SQLAnyEnum

[HKEY_CLASSES_ROOT\CLSID\{GUID2}]
@="SQLAnyEnum.11"

[HKEY_CLASSES_ROOT\CLSID\{GUID2}\InprocServer32]
@="d:\\mypath\\bin32\\myoledb11.dll"
"ThreadingModel"="Both"

[HKEY_CLASSES_ROOT\CLSID\{GUID2}\OLE DB Enumerator]
@="Sybase SQL Anywhere OLE DB Provider Enumerator"

[HKEY_CLASSES_ROOT\CLSID\{GUID2}\ProgId]
@="SQLAnyEnum.11"

[HKEY_CLASSES_ROOT\CLSID\{GUID2}\VersionIndependentProgID]
@="SQLAnyEnum" 

; SQLAnyA

[HKEY_CLASSES_ROOT\CLSID\{GUID4}]
@="SQLAnyA.11"

[HKEY_CLASSES_ROOT\CLSID\{GUID4}\InprocServer32]
@="d:\\mypath\\bin32\\myoledba11.dll"
"ThreadingModel"="Both"

[HKEY_CLASSES_ROOT\CLSID\{GUID4}\ProgID]
@="SQLAnyA.11"

[HKEY_CLASSES_ROOT\CLSID\{GUID4}\VersionIndependentProgID]
@="SQLAnyA"