通过生成一组唯一的 GUID、命名提供程序以及选择唯一的 DLL 名称,创建一个可利用应用程序部署的唯一 OLE DB 提供程序。
前提条件
执行此任务没有前提条件。
将以下内容复制到文本编辑器,将其保存为 .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" |
注册表值的名称区分大小写。
使用 Microsoft Visual Studio uuidgen 实用程序创建 4 个有顺序的 UUID (GUID)。
例如,在命令提示符下运行以下命令:
uuidgen -n4 -s -x >oledbs.txt |
按以下顺序指派 4 个 UUID 或 GUID:
提供程序类 ID(下面的 GUID1)。
枚举类 ID(下面的 GUID2)。
ErrorLookup 类 ID(下面的 GUID3)。
提供程序帮助类 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)是递增的。
使用编辑器的 [查找/替换] 功能将文本中的 GUID1、GUID2、GUID3 和 GUID4 更改为相应的 GUID(例如,如果 41dfe9f3-db92-11d2-8c43-006008d26a6f 是由 uuidgen 生成的 GUID,则 GUID1 将用其替换)。
选择在应用程序的连接字符串中所使用的提供程序名称等(例如 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(dboledb16.dll 和 dboledba16.dll)的副本。
copy dboledb16.dll myoledb16.dll copy dboledba16.dll myoledba16.dll |
没有适用于 Windows Mobile 的 dboledba16.dll。
特殊注册表项将由脚本基于您所选择的 DLL 名称创建。此名称应不同于标准的 DLL 名称(例如 dboledb16.dll 或 dboledba16.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 |
使用编辑器的 [查找/替换] 功能将在注册表脚本中出现的所有 myoledb16 和 myoledba16 更改为您所选择的两个 DLL 名称。
使用编辑器的 [查找/替换] 功能将所有在注册表脚本中出现的 d:\\mypath\\bin32\\ 更改为 DLL 的安装位置。请务必使用一对斜线来表示单个斜线。此步骤必须在应用程序安装时自定义。
将注册表脚本保存到磁盘并且运行它。
尝试运行新的提供程序。切勿忘记将 ADO/OLE DB 应用程序更改为使用新的提供程序名称。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |