什么是 odbcjt32.dll真实路径、System32 或 SysWOW64 来检查它的参数



我正在尝试通过注册表以编程方式创建ODBC连接。

使用 Windows ODBC 工具时,我注意到对于 ODBC 32,"Microsoft访问驱动程序 (*.mdb("使用的是 odbcjt32.dll注册表中的条目将指向以下位置:

"Driver"="C:\Windows\system32\odbcjt32.dll"

但是当我搜索该文件时,它存在,但位于其他文件夹中:

C:WindowsSysWOW64

我需要知道为什么,因为:

  • 我需要从 C# 创建连接,我想我应该像 ODBC 工具一样将条目放入 C:\Windows\system32
  • 我想从 C# 检查这个 DLL 版本,所以我应该检查 C:\Windows\SysWOW64\odbcjt32.dll ??

在Windows中有一个神奇的重定向这个DLL

?感谢您的澄清,

有关 SysWoW64 和 system32 的一些背景信息,请参阅超级用户问题"Windows 7 上的 System32 和 SysWOW64"。所以是的,Windows 上有 32 位和 64 位 DLL 的"魔术重定向"。

C:\Windows\SysWOW64 中的文件 odbcjt32.dll 是 32 位版本。路径 C:\Windows\system32\ 被重定向到 C:\Windows\SysWOW64\ 对于 32 位程序。您的程序的当前解决方案平台是什么?x86、x64 或任何 CPU?我认为它应该是 x86,以便它可以使用 32 位驱动程序。

查看Environment.GetFolderPath方法Environment.SpecialFolder.SystemX86,这样就不需要对路径进行硬编码。

有关魔术重定向的其他信息

要查看 DLL 的位数,您可以使用dumpbin。我在下面的示例中使用"odbc32.dll"。打开 Visual Studio 版本的Developer Command Prompt并执行以下命令:

dumpbin /headers c:windowssyswow64odbc32.dll

输出将包含以下行:

FILE HEADER VALUES
14C machine (x86)

现在为system32目录中的 DLL 执行转储:

dumpbin /headers c:windowssystem32odbc32.dll

哪些输出

FILE HEADER VALUES
8664 machine (x64)

如您所见,计算机上有相同DLL的x64("64位"(和x86("32位"(版本。Windows 根据正在运行的程序的位数执行魔术重定向。64 位程序从 C:\Windows\system32 获取 DLL,32 位程序从 C:\Windows\SysWoW64 获取 DLL。

但是为什么要创建DSN?

您可以这样做:

string MyCon = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};dbq=C:\Test2\test44.accdb";
DataTable MyTable = new DataTable();
OdbcDataAdapter MyData = new OdbcDataAdapter("select * from tblHotels", MyCon);
MyData.Fill(MyTable);
MessageBox.Show("Records = " + MyTable.Rows.Count.ToString() );

我们只需要:

using System.Data;
using System.Data.Odbc;

我的意思是,您的实用程序可能想要创建DSN,但是如果您只是想创建连接,那么上述就可以了。只要安装了 ACE32 或 ACE 64 位版本,就可以正常工作。

请注意,odbcjt32.dll 是一个 x32 位仅组件。您将永远不会找到或看到 x64 位版本 - 它不存在。安装 ACE x64 也不会安装该.dll。

但是,不清楚为什么需要创建DSN连接,而不是在应用程序(或某些安装文件(中仅具有上述连接字符串的设置?尝试创建 DSN 通常需要提升的权限,但您可以按照上述方式对 ODBC 使用简单的连接字符串来代替 DSN。上面的代码截图不需要特殊的引用 - 它只是使用内置于网络框架中的 ODBC 部分。

最新更新