Wenn der OLE DB-Provider installiert wird, muss die Windows-Registrierung geändert werden. Hierzu wird gewöhnlich die in den OLE DB-Provider integrierte Selbstregistrierungsfunktion verwendet. Sie können z.B. das Windows-Tool regsvr32 verwenden. Eine Standardgruppe von Registrierungseinträgen wird vom Provider erstellt.
In einer typischen Verbindungszeichenfolge ist eine der Komponenten das Providerattribut. Um anzuzeigen, dass der SQL Anywhere OLE DB-Provider verwendet werden soll, geben Sie den Namen des Providers an. Im Folgenden sehen Sie ein Visual Basic-Beispiel:
connectString = "Provider=SAOLEDB;DSN=SQL Anywhere 12 Demo" |
In ADO bzw. OLE DB gibt es zahlreiche weitere Wege, den Provider namentlich zu referenzieren. Im folgenden C++-Beispiel wird neben dem Providernamen auch die zu verwendende Version angegeben.
hr = db.Open(_T("SAOLEDB.12"), &dbinit); |
Der Providername wird in der Registrierung gesucht. Wenn Sie die Registrierung auf Ihrem Computersystem untersuchen, finden Sie den Eintrag in HKEY_CLASSES_ROOT für SAOLEDB.
[HKEY_CLASSES_ROOT\SAOLEDB] @="SQL Anywhere OLE DB Provider" |
Er hat zwei Sub-Schlüssel, die einen Klassenbezeichner (ClsId) und die aktuelle Version (CurVer) des Providers enthalten. Beispiel:
[HKEY_CLASSES_ROOT\SAOLEDB\Clsid] @="{41dfe9f7-db91-11d2-8c43-006008d26a6f}" [HKEY_CLASSES_ROOT\SAOLEDB\CurVer] @="SAOLEDB.12" |
Es sind mehrere ähnliche Einträge vorhanden. Sie werden verwendet, um eine spezifische Instanz eines OLE DB-Providers zu identifizieren. Wenn Sie Clsid in der Registrierung unter HKEY_CLASSES_ROOT\CLSID suchen und die Sub-Schlüssel überprüfen, stellen Sie fest, dass einer der Einträge den Speicherort der Provider-DLL angibt.
[HKEY_CLASSES_ROOT\CLSID\ {41dfe9f3-db91-11d2-8c43-006008d26a6f}\ InprocServer32] @="c:\\sa12\\bin64\\dboledb12.dll" "ThreadingModel"="Both" |
Hier liegt das Problem vor, dass die Struktur sehr monolithisch ist. Würden Sie die SQL Anywhere-Software von Ihrem System deinstallieren, würden die Registrierungseinträge für den OLE DB-Provider entfernt und die Provider-DLL würde von der Festplatte entfernt. Die Anwendungen, die den Provider benötigen, könnten nicht mehr ausgeführt werden.
Wenn Anwendungen verschiedener Hersteller denselben OLE DB-Provider verwenden, würde jede Installation des Providers die gemeinsamen Registrierungseinstellungen überschreiben. Die Version des Providers, den Sie für Ihre Anwendung vorgesehen haben, würde in diesem Fall von einer neueren (oder älteren!) Version des Providers ersetzt.
Dies könnte zu einer unerwünschten Instabilität führen. Um dieses Problem zu vermeiden, kann der SQL Anywhere OLE DB-Provider angepasst werden. Im Folgenden sind die Schritte beschrieben, die Sie zur Erstellung einer benutzerdefinierten Version des OLE DB-Providers ausführen müssen.
In dieser Übung generieren Sie eine eindeutige Gruppe von GUIDs und wählen einen eindeutigen Provider-Namen und eindeutige DLL-Namen. Mit diesen drei Aufgaben erstellen Sie einen eindeutigen OLE DB-Provider, den Sie in das Deployment Ihrer Anwendung einbeziehen können.
Erstellen Sie eine Kopie der weiter unten abgebildeten Beispiel-Registrierungsdatei. Sie ist aufgrund ihrer Länge im Anschluss an diese Schritte abgebildet. Der Dateiname muss das Suffix .reg haben. Bei den Namen der Registrierungswerte wird die Groß-/Kleinschreibung berücksichtigt.
Verwenden Sie das Microsoft Visual Studio uuidgen-Dienstprogramm, um 4 sequenzielle UUIDs (GUIDs) zu erstellen.
uuidgen -n4 -s -x >oledbguids.txt |
Die 4 UUIDs bzw. GUIDs werden in der folgenden Sequenz zugewiesen:
Die Provider-Klassen-ID (unten GUID1)
Die Enum-Klassen-ID (unten GUID2)
Die ErrorLookup-Klassen-ID (unten GUID3)
Die Provider Assist-Klassen-ID (unten GUID4). Diese letzte GUID wird in Windows Mobile-Deployments nicht verwendet.
Es ist wichtig, dass die IDs sequenziell zugeordnet werden (dies wird von der Option -x in der uuidgen-Befehlszeile festgelegt). Jede GUID sollte ähnlich wie die folgende angezeigt werden.
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 |
Beachten Sie, dass sich der erste Teil der GUID (z.B. 41dfe9f3) erhöht.
Ändern Sie mit der Suchen/Ersetzen-Funktion eines Editors alle GUID1-, GUID2-, GUID3- und GUID4-Textstellen im Text in die entsprechende GUID (GUID1 würde z.B. durch 41dfe9f3-db92-11d2-8c43-006008d26a6f ersetzt, wenn dies die GUID wäre, die uuidgen für Sie generiert hat).
Legen Sie Ihren Providernamen fest. Dies ist der Name, den Sie in Ihrer Anwendung in Verbindungszeichenfolgen usw. verwenden (z.B. Provider=SQLAny). Die folgenden Namen dürfen nicht verwendet werden. Diese Namen werden von SQL Anywhere benutzt.
Version 10 oder höher | Version 9 oder früher |
---|---|
SAOLEDB | ASAProv |
SAErrorLookup | ASAErrorLookup |
SAEnum | ASAEnum |
SAOLEDBA | ASAProvA |
Ändern Sie mit der Suchen/Ersetzen-Funktion eines Editors alle Textstellen der Zeichenfolge "SQLAny" in den von Ihnen gewählten Providernamen. Dies umfasst auch alle Textstellen, bei denen "SQLAny" ein Teil einer längeren Zeichenfolge ist (z.B. SQLAnyEnum).
Angenommen Sie wählen den Providernamen "Acme". Die Namen, die im Registrierungseintrag HKEY_CLASSES_ROOT angezeigt werden, sind in der folgenden Tabelle zusammen mit den SQL Anywhere-Namen (zum Vergleich) aufgelistet.
SQL Anywhere-Provider | Ihr benutzerdefinierter Provider |
---|---|
SAOLEDB | Acme |
SAErrorLookup | AcmeErrorLookup |
SAEnum | AcmeEnum |
SAOLEDBA | AcmeA |
Erstellen Sie Kopien der SQL Anywhere-Provider-DLLs (dboledb12.dll und dboledba12.dll) unter verschiedenen Namen. Beachten Sie, dass es die Datei dboledba12.dll nicht für Windows Mobile gibt.
copy dboledb12.dll myoledb12.dll copy dboledba12.dll myoledba12.dll |
Vom Skript, das auf dem gewählten DLL-Namen basiert, wird ein spezieller Registrierungsschlüssel erstellt. Der Name muss sich von den Standard-DLL-Namen (z.B. dboledb12.dll oder dboledba12.dll) unterscheiden. Wenn Sie die Provider-DLL myoledb12 nennen, sucht der Provider in HKEY_CLASSES_ROOT einen Registrierungseintrag mit demselben Namen. Das gilt auch für die Provider-Schema-Assist-DLL. Wenn Sie die DLL myoledba12 nennen, sucht der Provider in HKEY_CLASSES_ROOT einen Registrierungseintrag mit demselben Namen. Der gewählte Name muss eindeutig sein und darf von keinem anderen Benutzer verwendet werden. Hier einige Beispiele.
Gewählte DLL-Namen | Entsprechung 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 |
Ändern Sie mit der Suchen/Ersetzen-Funktion eines Editors alle Textstellen der Zeichenfolgen myoledb12 und myoledba12 im Registrierungsskript in die beiden von Ihnen gewählten DLL-Namen.
Ändern Sie mit der Suchen/Ersetzen-Funktion eines Editors alle Textstellen der Zeichenfolge d:\\mypath\\bin32\\ im Registrierungsskript in den Speicherort, an dem die DLLs installiert wurden. Verwenden Sie zwei Schrägstriche, wenn Sie einen einzelnen Schrägstrich angeben wollen. Dieser Schritt muss zum Zeitpunkt der Anwendungsinstallation ausgeführt werden.
Speichern Sie das Registrierungsskript auf der Festplatte und führen Sie es aus.
Probieren Sie den neuen Provider aus. Ändern Sie Ihre ADO/OLE DB-Anwendung so, dass sie den neuen Providernamen verwendet.
Im Folgenden ist das Registrierungsskript abgebildet, das geändert werden muss.
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" |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |