.
在不安装客户端实用程序的情况下启用 SQL DMO 客户端
(http://support.microsoft.com/kb/248241/zh-cn)
概要
本文介绍在无需安装 SQL Server 客户端实用程序的情况下启用 SQL Server 分布式管理对象 (SQL-DMO) 客户端功能所需的步骤。
典型情况
您 编写一个利用 SQL Server 中的 SQL-DMO 对象模型的应用程序。您的应用程序在服务器计算机中能正常运行,而在安装 了 SQL Server 客户端实用程序的客户端计算机中也能正常运行。但是,该应用程序无法单独运行。此外,您还可能看到几个与此相关的错误。最常见 的错误是:
ActiveX can’t create object
Field is not bound correctly
Cannot find entry point
注意:安装 Microsoft 数据访问组件 (MDAC) 无法解决此问题。
MDAC 不 会安装 Sqldmo.dll 文件或与该文件关联的许多从属 DLL 中的任何一个。MDAC 所包括的是 SQL-DMO 客户端连接使用的许多相 关 DLL。无论如何,将 MDAC 与您的应用程序安装绑定都不是最理想的解决办法,因为要使您的 DMO 连接工作,您无需安装所有 的 MDAC DLL。另外,MDAC 还会在客户端计算机上安装许多您可能永远都不会用到的其他功能。这里的主要意思是,您不必安装所有 MDAC 来 获取您需要的功能,而是只安装必需的 DLL 即可。本文后面将介绍这些 DLL。
在讨论不同类型的 DLL 以及需要将它们放置在哪里 之前,让我们偏离一下主题,简要回顾一下基于 Win32 和 COM 的 DLL。在本文中,您只需了解如何区分这些 DLL 以及在识别它们之后如何 处理它们。了解这一点之后,看看以下您需要了解的内容: • 您需要通过 Regsvr32 实用程序注册基于 COM 的 DLL。
• 您需要将本机 Win32 DLL 放置在应用程序路径中。
• 可能还需要将本机 Win32 DLL 放置在 Win32 目录中。
有时候很难区分基于 COM 的 DLL 和非基于 COM 的 DLL;但是,通常情况下,基于 COM 的 DLL 始终具有以下入口点:
• DllGetClassObject
• DllRegisterServer
• DllUnregisterServer
• DllCanUnloadNow
要查看入口点,请右键单击 DLL,然后单击快捷菜单中的“快速查看”。所显示的信息记录在 DLL 信息的“导出表”部分中。
以下是您从客户端启用 DMO 所需的与 SQL-DMO 有关的 DLL 列表:
• Sqldmo.dll
• Sqldmo.rll
• Sqlsvc.dll
• Sqlsvc.rll
• Sqlwoa.dll
• Sqlresld.dll
• Sqlwid.dll
• W95scm.dll
在上面的 DLL 列表中,Sqldmo.dll 是唯一您需要在客户端计算机上注册的 DLL。但是,要成功注册 Sqldmo.dll 文件,Sqldmo.rll 文件必须存在于客户端计算机上的以下目录中:
(服务器端位置):c:\Mssql7\Binn\Resources\1033
(客户端位置):c:\Winnt\System32\Resources\1033
Sqldmo.rll 文 件总是会引发问题。.rll 文件是本地化的资源文件。资源目录会根据 SQL Server 和客户端安装上配置的国家/地区语言的不同而异。在本例 中,目录 1033 是语言标识符 0X0409 的十进制表示,代表美国英语。将该 .rll 文件放置在适当的位置之后,可以通过调 用 Regsvr32 实用程序来注册 Sqldmo.dll 文件。注册该文件的命令是: C:\Regsvr32 Sqldmo.dll
注册成功后,应收到以下消息:
SQLDMO.dll 中的 DLLRegisterServer 成功。
如果您希望在您的应用程序安装例行过程中自动进行此类注册,请参见与 Regsvr32 实用程序关联的各个开关。以静默方式注册该文件的命令是: c:\regsvr32 /s- sqldmo.dll
客户端计算机上包含 Sqldmo.dll 文件的目录必须具有特定的结构,否则您可能会收到类似如下的错误消息:
LoadLibrary(“C:\Winnt\System32\sqldmo.dll”) 失败。
GetLastError 返回 0x0000007e
该 错误意味着发生了错误 126(以十进制表示),该错误对应于“找不到指定模块”错误。在本例中,此错误与 Sqldmo.rll 文件有关。 即,Regsvr32 实用程序找到了 Sqldmo.dll 文件,但无法完成该文件的注册,因为 Sqldmo.rll 文件不在预期 的 1033 子目录中。
要避免该问题,请执行下列操作:
1. 在 Sqldmo.dll 所在的目录中添加名为“Resources”的目录。
2. 在“Resources”目录下添加名为“1033”的子目录。
3. 将 Sqldmo.rll 文件复制到该目录中。
完成后,目录结构应类似如下:
包含 Sqldmo.dll 的目录\Resources\1033
且该 1033 目录应包含 Sqldmo.rll 文件。
除了前面提到的 DLL,您还需要确保您安装了正确的网络库 DLL。您在此需要的主要网络库 DLL 为: • 命名管道:Dbnmpntw.dll
• 套接字:Dbmssocn.dll
• 多协议:Dbmsrpcn.dll
这些 DLL 都是基于 Win32 的 DLL,因此您不必注册它们。只需将这些 DLL 放入 Microsoft Windows NT 的 System32 目录中,或 Microsoft Windows 95/Windows 98 的 System 目录中。
完成前面的步骤之后,客户端应用程序应当能够正常启动,不会出现最初由于缺少必要文件而导致的任何问题。
2008/01/17
实际案例:
在一台机器上布置SQLWEBADMIN后发现运行时出现如下错误:
Retrieving the COM class factory for component with CLSID {10020200-E260-11CF-AE68-00AA004A34D5} failed due to the following error: 80040154.
解决方案:
根据上面的文档,找到相应的文件,
将
Sqldmo.dll,Sqlsvc.dll,Sqlwoa.dll,Sqlresld.dll,Sqlwid.dll,W95scm.dll
复制到 %windir%\system32
将
Sqldmo.rll
Sqlsvc.rll
复制到 %windir%\system32\Resources\1033\
或(和)%windir%\system32\Resources\2052\
然后运行:regsvr32 Sqldmo.dll
成功注册,最终也解决了上述布署过程中遇到的问题.