ODBC 管理员工具在 64 位版本的 Windows 中同时显示 32 位和 64 位用户 DSN

本文提供针对 ODBC 数据源管理员工具中出现的问题的解决方法。

原始产品版本:SQL Server
原始 KB 数: 942976

现象

Microsoft Windows 操作系统的 64 位版本包括以下版本的 ODBC 数据源管理员工具(Odbcad32.exe):

  • Odbcad32.exe文件的 32 位版本位于%systemdrive%\Windows\SysWoW64文件夹中。
  • Odbcad32.exe 文件的 64 位版本位于%systemdrive%\Windows\System32文件夹中。

Odbcad32.exe文件显示以下类型的数据源名称(DSN):

  • 系统 DSN
  • 用户 DSN

症状 1

32 位版本的 ODBC 管理器工具显示 32 位系统 DSN、32 位用户 DSN 和 64 位用户 DSN。 64 位版本的 ODBC 管理员工具显示 64 位系统 DSN、32 位用户 DSN 和 64 位用户 DSN。

症状 2

SQLDataSources 函数返回所有版本的用户 DSN,而不考虑应用程序的体系结构。 在 32 位应用程序中调用的 SQLDataSources 函数仅返回 32 位驱动程序的系统 DSN,但返回 32 位驱动程序和 64 位驱动程序的用户 DSN。 同样,在 64 位应用程序中调用的 SQLDataSources 函数仅返回 64 位驱动程序的系统 DSN,但返回 32 位驱动程序和 64 位驱动程序的用户 DSN。 因此,如果应用程序通过从 SQLDataSources 函数返回的用户 DSN 建立连接,则可能会收到以下错误消息:

未找到数据源名称且未指定默认驱动程序

例如,考虑以下情况。 你为 32 位驱动程序 "Microsoft Access Driver (*.mdb)" 创建了一个用户 DSN。 此驱动程序没有相应的 64 位版本。 在 64 位应用程序中调用的 SQLDataSources 函数返回此 32 位用户 DSN。 但是,如果通过此 32 位用户 DSN 建立连接,则会收到本部分前面提到的错误消息。

原因

用户 DSN 存储在以下注册表子项下:

HKEY_CURRENT_USER\Software\ODBC\ODBC.INI

此注册表子项未启用注册表重定向。 因此,用户 DSN 在 32 位和 64 位版本的 ODBC 管理员工具中都可见。

解决方法

要保持向后兼容性,目前没有针对此问题的解决方案。

解决方法

要解决此问题,请使用相应版本的 ODBC 管理员工具。 如果在 64 位操作系统上以 32 位应用程序的形式生成并运行应用程序,则需要使用 %windir%\SysWOW64\odbcad32.exe ODBC 管理员工具创建 ODBC 数据源。 要指示 DSN 的类型,可以将 "_32" 添加到 32 位用户 DSN,将 "_64" 添加到 64 位用户 DSN。

详细信息

可以从控制面板调用 64 位 ODBC 管理员工具,以管理 64 位进程使用的用户 DSN 和系统 DSN。 在 64 位操作系统上,32 位 ODBC 管理员工具用于 Windows on Windows 64 (WOW64) 进程。 必须直接从 SysWoW64 文件夹中调用 32 位 ODBC 管理员工具。 可以使用 32 位 ODBC 管理员工具来管理 WOW64 进程使用的用户 DSN 和系统 DSN。

系统 DSN 存储在以下注册表子项中:

HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI

为此注册表子项启用了注册表重定向。 因此,32 位驱动程序和 64 位驱动程序的系统 DSN 是分开的。 64 位 ODBC 管理员工具不显示由 32 位 ODBC 管理员工具创建的系统 DSN。 同样,32 位 ODBC 管理员工具不显示由 64 位 ODBC 管理员工具创建的系统 DSN。 此外,64 位 ODBC 管理员工具不显示使用 32 位驱动程序的系统 DSN。 同样,32 位 ODBC 管理员工具不会显示使用 64 位驱动程序的系统 DSN。

用户 DSN 存储在以下注册表子项中:

HKEY_CURRENT_USER\Software\ODBC\ODBC.INI

此注册表子项未启用注册表重定向。 因此,这两个 ODBC 管理员工具都显示所有用户 DSN。

有关注册表重定向的更多信息,请参阅注册表重定向