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

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » Deployment für SQL Anywhere durchführen » Deployment von Datenbanken und Anwendungen » Deployment von Clientanwendungen » Deployment von OLE DB- und ADO-Clients

 

OLE DB-Provider anpassen

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 11 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.11"), &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) für den Provider enthalten. Hier ein Beispiel:

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

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

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:\\sa11\\bin64\\dboledb11.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.

In der folgenden Übung generieren Sie eine eindeutig 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.

Im Folgenden sind die Schritte beschrieben, die Sie zur Erstellung einer benutzerdefinierten Version des OLE DB-Providers ausführen müssen.

♦  So passen Sie den OLE DB-Provider an
  1. 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.

  2. Verwenden Sie das Microsoft Visual Studio uuidgen-Dienstprogramm, um 4 sequenzielle UUIDs (GUIDs) zu erstellen.

    uuidgen -n4 -s -x >oledbguids.txt
  3. Die 4 UUIDs bzw. GUIDs werden in der folgenden Sequenz zugewiesen:

    1. Die Provider-Klassen-ID (unten GUID1)

    2. Die Enum-Klassen-ID (unten GUID2)

    3. Die ErrorLookup-Klassen-ID (unten GUID3)

    4. 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.

  4. Ä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).

  5. 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
  6. Ä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
  7. Erstellen Sie Kopien der SQL Anywhere-Provider-DLLs (dboledb11.dll und dboledba11.dll) unter verschiedenen Namen. Beachten Sie, dass es keine Datei dboledba11.dll für Windows Mobile gibt.

    copy dboledb11.dll myoledb11.dll
    copy dboledba11.dll myoledba11.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. dboledb11.dll oder dboledba11.dll) unterscheiden. Wenn Sie die Provider-DLL myoledb11 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 myoledba11 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
    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. Ändern Sie mit der Suchen/Ersetzen-Funktion eines Editors alle Textstellen der Zeichenfolgen myoledb11 und myoledba11 im Registrierungsskript in die beiden von Ihnen gewählten DLL-Namen.

  9. Ä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.

  10. Speichern Sie das Registrierungsskript auf der Festplatte und führen Sie es aus.

  11. 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\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"