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

SAP Sybase SQL Anywhere 16.0 (中文) » SQL Anywhere 服务器 - 编程 » 数据库和应用程序部署 » 对客户端应用程序的要求 » OLE DB 和 ADO 客户端部署 » OLE DB 提供程序自定义

 

自定义 OLE DB 提供程序

通过生成一组唯一的 GUID、命名提供程序以及选择唯一的 DLL 名称,创建一个可利用应用程序部署的唯一 OLE DB 提供程序。

前提条件

执行此任务没有前提条件。

 任务
  1. 将以下内容复制到文本编辑器,将其保存为 .reg 文件:



    REGEDIT4
    ; Special registry entries for a private OLE DB provider.
    [HKEY_CLASSES_ROOT\myoledb16] 
    @="Custom SQL Anywhere OLE DB Provider 16.0" 
    [HKEY_CLASSES_ROOT\myoledb16\Clsid] @="{GUID1}" 
    ; Data1 of the following GUID must be 3 greater than the 
    ; previous, for example, 41dfe9f3 + 3 => 41dfe9ee. 
    [HKEY_CLASSES_ROOT\myoledba16] 
    @="Custom SQL Anywhere OLE DB Provider 16.0" 
    [HKEY_CLASSES_ROOT\myoledba16\Clsid] @="{GUID4}" 
    ; Current version (or version independent prog ID) 
    ; entries (what you get when you have "SQLAny" 
    ; instead of "SQLAny.16") 
    [HKEY_CLASSES_ROOT\SQLAny] 
    @="SQL Anywhere OLE DB Provider" 
    [HKEY_CLASSES_ROOT\SQLAny\Clsid] 
    @="{GUID1}" 
    [HKEY_CLASSES_ROOT\SQLAny\CurVer] 
    @="SQLAny.16" 
    [HKEY_CLASSES_ROOT\SQLAnyEnum] 
    @="SQL Anywhere OLE DB Provider Enumerator" 
    [HKEY_CLASSES_ROOT\SQLAnyEnum\Clsid] 
    @="{GUID2}" [HKEY_CLASSES_ROOT\SQLAnyEnum\CurVer] 
    @="SQLAnyEnum.16" [HKEY_CLASSES_ROOT\SQLAnyErrorLookup] 
    @="SQL Anywhere OLE DB Provider Extended Error Support" 
    [HKEY_CLASSES_ROOT\SQLAnyErrorLookup\Clsid] 
    @="{GUID3}" 
    [HKEY_CLASSES_ROOT\SQLAnyErrorLookup\CurVer] 
    @="SQLAnyErrorLookup.16" 
    [HKEY_CLASSES_ROOT\SQLAnyA] 
    @="SQL Anywhere OLE DB Provider Assist" 
    [HKEY_CLASSES_ROOT\SQLAnyA\Clsid] 
    @="{GUID4}" 
    [HKEY_CLASSES_ROOT\SQLAnyA\CurVer] 
    @="SQLAnyA.16" 
    ; Standard entries (Provider=SQLAny.16) 
    [HKEY_CLASSES_ROOT\SQLAny.16] 
    @="Sybase SQL Anywhere OLE DB Provider 16.0" 
    [HKEY_CLASSES_ROOT\SQLAny.16\Clsid] 
    @="{GUID1}" 
    [HKEY_CLASSES_ROOT\SQLAnyEnum.16] 
    @="Sybase SQL Anywhere OLE DB Provider Enumerator 16.0" 
    [HKEY_CLASSES_ROOT\SQLAnyEnum.16\Clsid] 
    @="{GUID2}" 
    [HKEY_CLASSES_ROOT\SQLAnyErrorLookup.16] 
    @="Sybase SQL Anywhere OLE DB Provider Extended Error Support 16.0" 
    [HKEY_CLASSES_ROOT\SQLAnyErrorLookup.16\Clsid] 
    @="{GUID3}" 
    [HKEY_CLASSES_ROOT\SQLAnyA.16] 
    @="Sybase SQL Anywhere OLE DB Provider Assist 16.0" 
    [HKEY_CLASSES_ROOT\SQLAnyA.16\Clsid] 
    @="{GUID4}" 
    ; SQLAny (Provider=SQLAny.16) 
    [HKEY_CLASSES_ROOT\CLSID\{GUID1}] 
    @="SQLAny.16"
    "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\\myoledb16.dll" 
    "ThreadingModel"="Both" 
    [HKEY_CLASSES_ROOT\CLSID\{GUID1}\OLE DB Provider] 
    @="Sybase SQL Anywhere OLE DB Provider 16.0" 
    [HKEY_CLASSES_ROOT\CLSID\{GUID1}\ProgID] 
    @="SQLAny.16" 
    [HKEY_CLASSES_ROOT\CLSID\{GUID1}\VersionIndependentProgID] 
    @="SQLAny" 
    ; SQLAnyErrorLookup 
    [HKEY_CLASSES_ROOT\CLSID\{GUID3}] 
    @="Sybase SQL Anywhere OLE DB Provider Error Lookup 16.0" 
    @="SQLAnyErrorLookup.16" 
    [HKEY_CLASSES_ROOT\CLSID\{GUID3}\InprocServer32] 
    @="d:\\mypath\\bin32\\myoledb16.dll" 
    "ThreadingModel"="Both" 
    [HKEY_CLASSES_ROOT\CLSID\{GUID3}\ProgID] 
    @="SQLAnyErrorLookup.16" 
    [HKEY_CLASSES_ROOT\CLSID\{GUID3}\VersionIndependentProgID] 
    @="SQLAnyErrorLookup" 
    ; SQLAnyEnum [HKEY_CLASSES_ROOT\CLSID\{GUID2}]
    @="SQLAnyEnum.16" 
    [HKEY_CLASSES_ROOT\CLSID\{GUID2}\InprocServer32] 
    @="d:\\mypath\\bin32\\myoledb16.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.16" 
    [HKEY_CLASSES_ROOT\CLSID\{GUID2}\VersionIndependentProgID] 
    @="SQLAnyEnum" 
    ; SQLAnyA [HKEY_CLASSES_ROOT\CLSID\{GUID4}] 
    @="SQLAnyA.16" 
    [HKEY_CLASSES_ROOT\CLSID\{GUID4}\InprocServer32] 
    @="d:\\mypath\\bin32\\myoledba16.dll" 
    "ThreadingModel"="Both" 
    [HKEY_CLASSES_ROOT\CLSID\{GUID4}\ProgID] 
    @="SQLAnyA.16" 
    [HKEY_CLASSES_ROOT\CLSID\{GUID4}\VersionIndependentProgID] 
    @="SQLAnyA"

    注册表值的名称区分大小写。

  2. 使用 Microsoft Visual Studio uuidgen 实用程序创建 4 个有顺序的 UUID (GUID)。

    例如,在命令提示符下运行以下命令:

    uuidgen -n4 -s -x >oledbs.txt

    按以下顺序指派 4 个 UUID 或 GUID:

    1. 提供程序类 ID(下面的 GUID1)。

    2. 枚举类 ID(下面的 GUID2)。

    3. ErrorLookup 类 ID(下面的 GUID3)。

    4. 提供程序帮助类 ID(下面的 GUID4)。此最后一个 GUID 不在 Windows Mobile 部署中使用。

    上述几项之间存在先后顺序(这就是在命令行中 -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)是递增的。

  3. 使用编辑器的 [查找/替换] 功能将文本中的 GUID1、GUID2、GUID3 和 GUID4 更改为相应的 GUID(例如,如果 41dfe9f3-db92-11d2-8c43-006008d26a6f 是由 uuidgen 生成的 GUID,则 GUID1 将用其替换)。

  4. 选择在应用程序的连接字符串中所使用的提供程序名称等(例如 Provider=SQLAny)。

    以下名称由 SQL Anywhere 保留,不能用作提供程序名称:

    版本 10 或更高版本 版本 9 或更早版本
    SAOLEDB ASAProv
    SAErrorLookup ASAErrorLookup
    SAEnum ASAEnum
    SAOLEDBA ASAProvA
  5. 使用编辑器的 [查找/替换] 功能将所有出现的字符串 SQLAny 更改为您所选择的提供程序名称。其中包括所有那些 SQLAny 可能为较长字符串(例如,SQLAnyEnum)的子串的位置。

    假定您选择 Acme 作为提供程序名称。将出现在 HKEY_CLASSES_ROOT 注册表配置单元中的名称以及供比较的 SQL Anywhere 名称如下表所示。

    SQL Anywhere 提供程序 您自定义的提供程序
    SAOLEDB Acme
    SAErrorLookup AcmeErrorLookup
    SAEnum AcmeEnum
    SAOLEDBA AcmeA
  6. 以不同名称制作 SQL Anywhere 提供程序 DLL(dboledb16.dlldboledba16.dll)的副本。

    copy dboledb16.dll myoledb16.dll
    copy dboledba16.dll myoledba16.dll

    没有适用于 Windows Mobile 的 dboledba16.dll

    特殊注册表项将由脚本基于您所选择的 DLL 名称创建。此名称应不同于标准的 DLL 名称(例如 dboledb16.dlldboledba16.dll),这一点非常重要。如果您将提供程序 DLL 命名为 myoledb16,则提供程序将在 HKEY_CLASSES_ROOT 中查找具有相同名称的注册表条目。上述情况同样适用于提供程序模式辅助 DLL。如果将 DLL 命名为 myoledba16,则提供程序将在 HKEY_CLASSES_ROOT 中查找具有相同名称的注册表条目。您选择的名称是唯一的并且不可能被任何其他人选择,这一点非常重要。下面是一些示例。

    所选的 DLL 名称 相应的 HKEY_CLASSES_ROOT\名称
    myoledb16.dll HKEY_CLASSES_ROOT\myoledb16
    myoledba16.dll HKEY_CLASSES_ROOT\myoledba16
    acmeOledb.dll HKEY_CLASSES_ROOT\acmeOledb
    acmeOledba.dll HKEY_CLASSES_ROOT\acmeOledba
    SAcustom.dll HKEY_CLASSES_ROOT\SAcustom
    SAcustomA.dll HKEY_CLASSES_ROOT\SAcustomA
  7. 使用编辑器的 [查找/替换] 功能将在注册表脚本中出现的所有 myoledb16myoledba16 更改为您所选择的两个 DLL 名称。

  8. 使用编辑器的 [查找/替换] 功能将所有在注册表脚本中出现的 d:\\mypath\\bin32\\ 更改为 DLL 的安装位置。请务必使用一对斜线来表示单个斜线。此步骤必须在应用程序安装时自定义。

  9. 将注册表脚本保存到磁盘并且运行它。

  10. 尝试运行新的提供程序。切勿忘记将 ADO/OLE DB 应用程序更改为使用新的提供程序名称。

结果

自定义 OLE DB 提供程序已配置完毕。

下一个

利用应用程序部署自定义 OLE DB 提供程序。