OLE DB プロバイダーをインストールする場合は、Windows レジストリの変更が必要です。通常、変更には OLE DB プロバイダーに組み込まれている自己登録機能を使用します。たとえば、Windows regsvr32 ツールを使用することができます。レジストリエントリの標準セットは、プロバイダーによって作成されます。
一般的な接続文字列では、コンポーネントの 1 つは Provider 属性になります。SQL Anywhere OLE DB プロバイダーを使用することを示すには、プロバイダーの名前を指定します。次に Visual Basic の場合の例を示します。
connectString = "Provider=SAOLEDB;DSN=SQL Anywhere 12 Demo" |
ADO か OLE DB または両方を使用する場合には、プロバイダーを名前で参照する方法が数多く存在します。次に示すのは C++ の例で、プロバイダー名の他に使用バージョンも指定しています。
hr = db.Open(_T("SAOLEDB.12"), &dbinit); |
プロバイダー名は、レジストリで検索されます。使用コンピューターシステムのレジストリを確認すると、HKEY_CLASSES_ROOT に SAOLEDB のエントリが見つかります。
[HKEY_CLASSES_ROOT\SAOLEDB] @="SQL Anywhere OLE DB Provider" |
そこには、プロバイダーに対して 2 つのサブキーがあり、クラス識別子 (Clsid) と現在のバージョン (CurVer) が指定されています。次に例を示します。
[HKEY_CLASSES_ROOT\SAOLEDB\Clsid] @="{41dfe9f7-db91-11d2-8c43-006008d26a6f}" [HKEY_CLASSES_ROOT\SAOLEDB\CurVer] @="SAOLEDB.12" |
同様のエントリが他にもいくつかあります。これらは、OLE DB プロバイダーの特定のインスタンスを識別するために使用されます。レジストリで HKEY_CLASSES_ROOT\CLSID の下の Clsid を探し、そのサブキーを見ると、エントリの 1 つでプロバイダー DLL のロケーションが指定されていることがわかります。
[HKEY_CLASSES_ROOT\CLSID\ {41dfe9f3-db91-11d2-8c43-006008d26a6f}\ InprocServer32] @="c:\\sa12\\bin64\\dboledb12.dll" "ThreadingModel"="Both" |
ここで問題になるのは、これが融通の利かない構造であることです。SQL Anywhere ソフトウェアをシステムからアンインストールすると、OLE DB プロバイダーのエントリがレジストリから削除され、プロバイダー DLL がハードドライブから削除されます。これにより、削除するプロバイダーに依存しているアプリケーションが動作しなくなります。
同様に、さまざまなベンダー製のアプリケーションが同じ OLE DB プロバイダーを使用している場合、そのプロバイダーをインストールするたびに、共通レジストリ設定が上書きされます。アプリケーションの動作に必要なプロバイダーのバージョンが、別の新しい (または古い) バージョンのプロバイダーに置き換わる可能性があります。
このような状況によって不安定な状態が生じるのは望ましくありません。この問題に対応するため、SQL Anywhere OLE DB プロバイダーはカスタマイズが可能になっています。ここでは、OLE DB プロバイダーのカスタムバージョンを作成する手順を説明します。
この演習では、ユニークな GUID セットを生成し、ユニークなプロバイダー名を選択し、ユニークな DLL 名を選択します。この 3 つの手順を踏むことで、アプリケーションとともに配備できるユニークな OLE DB プロバイダーが作成されます。
後に示すサンプル登録ファイルのコピーを作成します。登録ファイルは非常に長いので、手順の後に示しています。ファイル名には、サフィックスとして .reg を付けます。レジストリ値の名前は大文字と小文字を区別します。
Microsoft Visual Studio の uuidgen ユーティリティを使用して、4 つの連続する UUID (GUID) を作成します。
uuidgen -n4 -s -x >oledbguids.txt |
4 つの UUID または GUID は、次の順番で割り当てます。
Provider クラス ID (下の表の GUID1)。
Enum クラス ID (下の表の GUID2)。
ErrorLookup クラス ID (下の表の GUID3)。
Provider Assist クラス ID (下の表の GUID4)。最後の GUID は、Windows Mobile の場合の配備では使用されません。
この 4 つが連番であることが重要です (uuidgen コマンドラインで -x を指定することでそのようになります)。各 GUID は次のように表示されるはずです。
Name | 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)。
エディターの検索/置換機能を使用して、テキストに出現するすべての GUID1、GUID2、GUID3、GUID4 を対応する GUID に変更します (たとえば、uuidgen によって生成された GUID が上の表のような場合は、GUID1 を 41dfe9f3-db92-11d2-8c43-006008d26a6f に置き換えます)。
Provider 名を決定します。ここで決定する名前を、アプリケーションで接続文字列に使用します (例:Provider=SQLAny)。次の名前は使用しないでください。これらは、SQL Anywhere によって使用されています。
バージョン 10 以降 | バージョン 9 以前 |
---|---|
SAOLEDB | ASAProv |
SAErrorLookup | ASAErrorLookup |
SAEnum | ASAEnum |
SAOLEDBA | ASAProvA |
エディターの検索/置換機能を使用して、出現するすべての SQLAny という文字列を選択したプロバイダー名に変更します。置換対象には、長い文字列の一部として SQLAny が出現する箇所も含まれます (例:SQLAnyEnum)。
プロバイダー名を Acme としたとします。この場合に HKEY_CLASSES_ROOT レジストリに表示される名前を、比較しやすいように SQL Anywhere の名前とともに次の表に示します。
SQL Anywhere プロバイダー | カスタムプロバイダー |
---|---|
SAOLEDB | Acme |
SAErrorLookup | AcmeErrorLookup |
SAEnum | AcmeEnum |
SAOLEDBA | AcmeA |
SQL Anywhere プロバイダー DLL (dboledb12.dll と dboledba12.dll) のコピーを別の名前で作成します。Windows Mobile の場合、dboledba12.dll はありません。
copy dboledb12.dll myoledb12.dll copy dboledba12.dll myoledba12.dll |
スクリプトにより、選択した DLL 名に基づく特別なレジストリキーが作成されます。ここでは、標準の DLL 名 (dboledb12.dll、dboledba12.dll など) と名前が異なっていることが重要です。プロバイダー DLL 名を myoledb12 とすると、プロバイダーは HKEY_CLASSES_ROOT でこの名前のレジストリエントリを探します。プロバイダースキーマ支援 DLL の場合も同様です。DLL 名を myoledba12 とすると、プロバイダーは HKEY_CLASSES_ROOT でこの名前のレジストリエントリを探します。ユニークで、他人から選択されにくい名前にすることが重要です。次にその例を示します。
選択された DLL 名 | 対応する HKEY_CLASSES_ROOT\name |
---|---|
myoledb12.dll | HKEY_CLASSES_ROOT\myoledb12 |
myoledba12.dll | HKEY_CLASSES_ROOT\myoledba12 |
acmeOledb.dll | HKEY_CLASSES_ROOT\acmeOledb |
acmeOledba.dll | HKEY_CLASSES_ROOT\acmeOledba |
SAcustom.dll | HKEY_CLASSES_ROOT\SAcustom |
SAcustomA.dll | HKEY_CLASSES_ROOT\SAcustomA |
エディターの検索/置換機能を使用して、レジストリスクリプトに出現するすべての myoledb12 と myoledba12 を選択した 2 つの DLL 名に変更します。
エディターの検索/置換機能を使用して、レジストリスクリプトに出現するすべての d:\\mypath\\bin32\\ を DLL のインストールロケーションに変更します。1 つのスラッシュを表すのにスラッシュを 2 つ重ねる必要があることに注意してください。この手順は、アプリケーションのインストール時にカスタマイズが必要です。
レジストリスクリプトをディスクに保存して、実行します。
新しいプロバイダーを試します。新しいプロバイダー名を使用するよう ADO または OLE DB アプリケーションを必ず変更してください。
変更するレジストリスクリプトを次に示します。
REGEDIT4 ; Special registry entries for a private OLE DB provider. [HKEY_CLASSES_ROOT\myoledb12] @="Custom SQL Anywhere OLE DB Provider 12.0" [HKEY_CLASSES_ROOT\myoledb12\Clsid] @="{GUID1}" ; Data1 of the following GUID must be 3 greater than the ; previous, for example, 41dfe9f3 + 3 => 41dfe9ee. [HKEY_CLASSES_ROOT\myoledba12] @="Custom SQL Anywhere OLE DB Provider 12.0" [HKEY_CLASSES_ROOT\myoledba12\Clsid] @="{GUID4}" ; Current version (or version independent prog ID) ; entries (what you get when you have "SQLAny" ; instead of "SQLAny.12") [HKEY_CLASSES_ROOT\SQLAny] @="SQL Anywhere OLE DB Provider" [HKEY_CLASSES_ROOT\SQLAny\Clsid] @="{GUID1}" [HKEY_CLASSES_ROOT\SQLAny\CurVer] @="SQLAny.12" [HKEY_CLASSES_ROOT\SQLAnyEnum] @="SQL Anywhere OLE DB Provider Enumerator" [HKEY_CLASSES_ROOT\SQLAnyEnum\Clsid] @="{GUID2}" [HKEY_CLASSES_ROOT\SQLAnyEnum\CurVer] @="SQLAnyEnum.12" [HKEY_CLASSES_ROOT\SQLAnyErrorLookup] @="SQL Anywhere OLE DB Provider Extended Error Support" [HKEY_CLASSES_ROOT\SQLAnyErrorLookup\Clsid] @="{GUID3}" [HKEY_CLASSES_ROOT\SQLAnyErrorLookup\CurVer] @="SQLAnyErrorLookup.12" [HKEY_CLASSES_ROOT\SQLAnyA] @="SQL Anywhere OLE DB Provider Assist" [HKEY_CLASSES_ROOT\SQLAnyA\Clsid] @="{GUID4}" [HKEY_CLASSES_ROOT\SQLAnyA\CurVer] @="SQLAnyA.12" ; Standard entries (Provider=SQLAny.12) [HKEY_CLASSES_ROOT\SQLAny.12] @="Sybase SQL Anywhere OLE DB Provider 12.0" [HKEY_CLASSES_ROOT\SQLAny.12\Clsid] @="{GUID1}" [HKEY_CLASSES_ROOT\SQLAnyEnum.12] @="Sybase SQL Anywhere OLE DB Provider Enumerator 12.0" [HKEY_CLASSES_ROOT\SQLAnyEnum.12\Clsid] @="{GUID2}" [HKEY_CLASSES_ROOT\SQLAnyErrorLookup.12] @="Sybase SQL Anywhere OLE DB Provider Extended Error Support 12.0" [HKEY_CLASSES_ROOT\SQLAnyErrorLookup.12\Clsid] @="{GUID3}" [HKEY_CLASSES_ROOT\SQLAnyA.12] @="Sybase SQL Anywhere OLE DB Provider Assist 12.0" [HKEY_CLASSES_ROOT\SQLAnyA.12\Clsid] @="{GUID4}" ; SQLAny (Provider=SQLAny.12) [HKEY_CLASSES_ROOT\CLSID\{GUID1}] @="SQLAny.12" "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\\myoledb12.dll" "ThreadingModel"="Both" [HKEY_CLASSES_ROOT\CLSID\{GUID1}\OLE DB Provider] @="Sybase SQL Anywhere OLE DB Provider 12.0" [HKEY_CLASSES_ROOT\CLSID\{GUID1}\ProgID] @="SQLAny.12" [HKEY_CLASSES_ROOT\CLSID\{GUID1}\VersionIndependentProgID] @="SQLAny" ; SQLAnyErrorLookup [HKEY_CLASSES_ROOT\CLSID\{GUID3}] @="Sybase SQL Anywhere OLE DB Provider Error Lookup 12.0" @="SQLAnyErrorLookup.12" [HKEY_CLASSES_ROOT\CLSID\{GUID3}\InprocServer32] @="d:\\mypath\\bin32\\myoledb12.dll" "ThreadingModel"="Both" [HKEY_CLASSES_ROOT\CLSID\{GUID3}\ProgID] @="SQLAnyErrorLookup.12" [HKEY_CLASSES_ROOT\CLSID\{GUID3}\VersionIndependentProgID] @="SQLAnyErrorLookup" ; SQLAnyEnum [HKEY_CLASSES_ROOT\CLSID\{GUID2}] @="SQLAnyEnum.12" [HKEY_CLASSES_ROOT\CLSID\{GUID2}\InprocServer32] @="d:\\mypath\\bin32\\myoledb12.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.12" [HKEY_CLASSES_ROOT\CLSID\{GUID2}\VersionIndependentProgID] @="SQLAnyEnum" ; SQLAnyA [HKEY_CLASSES_ROOT\CLSID\{GUID4}] @="SQLAnyA.12" [HKEY_CLASSES_ROOT\CLSID\{GUID4}\InprocServer32] @="d:\\mypath\\bin32\\myoledba12.dll" "ThreadingModel"="Both" [HKEY_CLASSES_ROOT\CLSID\{GUID4}\ProgID] @="SQLAnyA.12" [HKEY_CLASSES_ROOT\CLSID\{GUID4}\VersionIndependentProgID] @="SQLAnyA" |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |