OLE DB 驱动程序安装检查

对象链接和嵌入数据库(OLE DB)是一种Microsoft数据访问技术,用于使用 OLE DB 访问接口将应用程序连接到各种数据源。 排查 OLE DB 驱动程序安装和验证问题可能很复杂,但对于无缝数据库交互至关重要。 本故障排除指南旨在提供有关与 OLE DB 驱动程序相关的问题的安装、验证和解决的见解。

关于 UDL 文件

测试 OLE DB 访问接口的最简单方法是通过通用数据链接 (UDL) 文件。 在 Windows 资源管理器中创建任何文本文件并将其重命名为具有 . UDL 文件扩展名。 请确保已启用文件扩展名才能进行更改。 有关详细信息,请参阅 使用 UDL 文件测试 OLE DB 与 SQL Server 的连接

双击该文件以打开一个对话框,可在其中查看已安装的提供程序并测试其连接。

屏幕截图显示如何使用 UDL 文件测试 OLE DB 提供程序。

注意

如果在对话框中选择“确定”,则可以在记事本中打开 UDL 文件,以查看可在应用程序中使用的连接字符串。 例如:

Provider=SQLNCLI11.1;Integrated Security="";Persist Security Info=False;User ID=sa;Initial Catalog=northwind;Data Source=tcp:SQLProd01.contoso.com,1433;Initial File Name="";Server SPN=""

UDL 文件 UI 由OLEDB32.DLL提供,托管在RUNDLL32.DLL

  • 对于 32 位系统或 64 位系统上的 64 位提供程序,请使用以下命令:

    Rundll32.exe "C:\Program Files\Common Files\System\OLE DB\oledb32.dll",OpenDSLFile C:\test.udl

  • 对于 64 位系统上的 32 位提供程序,请使用以下命令:

    C:\Windows\SysWOW64\Rundll32.exe C:\PROGRA~2\COMMON~1\System\OLEDB~1\oledb32.dll,OpenDSLFile C:\test.udl32

. UDL 文件扩展名映射到第一个命令。 对于第二种情况,可以通过运行 32 位命令提示符,然后运行 START C:\TEMP\TEST.UDL 以测试 32 位提供程序来简化操作。 甚至更简单的是映射 。UDL32 文件扩展名为 32 位命令。

32 位 .udl32 文件扩展名映射

如果经常使用 32 位提供程序,则可以映射文件扩展名 .udl32 以启动 32 位 UDL 对话框。 执行以下步骤:

  1. 将脚本复制到记事本,并将其另存为 udl32.reg

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\.UDL32]
    @="ft000001"
    
    [HKEY_CLASSES_ROOT\ft000001]
    @="Microsoft Data Link 32"
    "BrowserFlags"=dword:00000008
    "EditFlags"=dword:00000000
    
    [HKEY_CLASSES_ROOT\ft000001\shell]
    @="open"
    
    [HKEY_CLASSES_ROOT\ft000001\shell\open]
    
    [HKEY_CLASSES_ROOT\ft000001\shell\open\command]
    @="C:\\Windows\\SysWOW64\\Rundll32.exe C:\\PROGRA~2\\COMMON~1\\System\\OLEDB~1\\oledb32.dll,OpenDSLFile %1"
    
    [HKEY_CLASSES_ROOT\ft000001\shell\open\ddeexec]
    
  2. 双击 .reg 文件,然后可以创建扩展名为 .udl32 的文件。 例如, test.udl32。 它将启动 32 位 UDL 对话框。 例如:

    屏幕截图显示了 32 位 UDL 对话框的示例。

验证 OLE DB 提供程序

验证提供程序的第一步是查看名称是否显示在 64 位或 32 位 UDL 对话框的已安装提供程序列表中,如上所示。 如果没有,则需要重新安装提供商或咨询供应商。

还可以跟踪注册表中的驱动程序位置。 驱动程序名称是 COM ProgID,可以在HKEY_CLASSES_ROOT中找到它。

在下图中,可以看到 ProgID SQLNCLI11.1 与提供程序名称 SQL Server Native Client 11.0 之间的映射。

屏幕截图显示了 ProgID SQLNCLI11.1 与提供程序名称 SQL Server Native Client 11.0 之间的映射。

32 位和 64 位提供程序的 ProgID 都显示在此密钥下。

除了 SQLNCLI11.1,还有一个名为 SQLNCLI11 的 ProgID。 原因是提供程序开发人员可能允许同一提供程序的多个版本并排安装,每个版本都有不同的数字后缀。 未编号的名称是与版本无关的 ProgID。 应用程序可以指向此目标,并重定向到最新版本的提供程序。

对于所有意向和目的,这两个不同的 ProgID 名称应等效。 然而,在少数情况下,他们没有。 使用与版本无关的名称的应用程序无法连接,但如果使用版本控制 ProgID,则它们可以连接。 原因是两个条目指向不同的 CLSID 值,即如何查找提供程序 DLL。

屏幕截图显示如何使用版本控制 ProgId 查找提供程序 dll。

CLSID这是 COM GUID。 COM 基础结构从 ProgID 中找到 GUID。 然后,它会在密钥下 HKEY_CLASSES_ROOT\CLSID 查找 GUID 与密钥名称匹配的密钥:

屏幕截图显示如何在 HKEY_CLASSES_ROOT\CLSID 下查找 ProgId 中的 GUID。

该值 InProcServer32 指向提供程序 DLL。

对于 32 位提供程序,COM 使用相同的 GUID,但在下 HKEY_CLASSES_ROOT\Wow6432Node\CLSID查找它。

屏幕截图显示提供程序位于 SysWow64 文件夹中。

在这种情况下,提供程序位于 SysWow64 文件夹中。

注意

这些示例来自 64 位计算机。 在 32 位计算机上,注册表中没有 Wow6432Node

以下是 64 位计算机的注册表编辑器中 SQL Native Client 11.0 的路径

  • HKEY_CLASSES_ROOT\SQLNCLI.1\CLSID
  • HKEY_CLASSES_ROOT\CLSID\<guid>\InProcServer32
  • HKEY_CLASSES_ROOT\Wow6432Node\CLSID\<guid>\InProcServer32

以下是 32 位计算机的注册表编辑器中的路径:

  • HKEY_CLASSES_ROOT\SQLNCLI.1\CLSID
  • HKEY_CLASSES_ROOT\CLSID\{guid}\InProcServer32

支持第三方提供程序

对第三方 OLE DB 提供程序的支持仅限于验证 ProgID 指向有效的 CLSID,子 InProcServer32 项指向正确的 DLL。 如果路径不正确或注册表项不存在,请重新安装提供程序或联系供应商。 如果文件存在但注册表项不存在,则可以使用 REGSVR32 手动注册提供程序。 若要注册 COM DLL,请在提升的命令提示符处运行以下命令:

Regsvr32 sqlncli11

屏幕截图显示了注册 COM DLL 的管理员命令。

如果有 32 位和 64 位版本的提供程序,请针对这两个 DLL 运行命令。 使用 32 位命令提示符注册 32 位 DLL。

详细信息