odbcjt32.dll 真实路径是什么,System32 或 SysWOW64 来检查它的参数
What is the odbcjt32.dll real path, System32 or SysWOW64 to check it's parameters
我正在尝试通过注册表以编程方式创建 ODBC 连接。
当使用 Windows ODBC 工具时,我注意到对于 ODBC 32,"Microsoft Access Driver (*.mdb)" 使用 odbcjt32.dll 并且注册表中的条目将指向此位置:
"Driver"="C:\Windows\system32\odbcjt32.dll"
但是当我搜索文件时,它存在,但位于其他文件夹中:
C:\Windows\SysWOW64
我需要知道原因,因为:
- 我需要从 C# 创建连接,我想我应该像 ODBC 工具那样把条目放到 C:\Windows\system32
- 我想从 C# 检查这个 DLL 版本,所以我应该检查 C:\Windows\SysWOW64\odbcjt32.dll ??
在 Windows 中有此 DLL 的魔术重定向?
感谢您的澄清,
有关 SysWoW64 和 system32 的一些背景信息,请参阅 the super user question "System32 and SysWOW64 on Windows 7"。所以是的,在 windows 上有一个 "magic redirection" 用于 32 位和 64 位 DLL。
C:\Windows\SysWOW64 中的文件 odbcjt32.dll 是 32 位版本。对于 32 位程序,路径 C:\Windows\system32\ 被重定向到 C:\Windows\SysWOW64\。您的程序当前的解决方案平台是什么? x86、x64 或任何 CPU?我觉得应该是x86的,这样才可以用32位的驱动。
看看 Environment.GetFolderPath
方法 Environment.SpecialFolder.SystemX86
这样你就不需要硬编码路径了。
有关魔术重定向的其他信息
要查看 DLL 的位数,您可以使用 dumpbin
。我在下面的示例中使用 "odbc32.dll"。打开你的 Visual Studio 版本的 Developer Command Prompt
并执行以下命令:
dumpbin /headers c:\windows\syswow64\odbc32.dll
输出将包含以下行:
FILE HEADER VALUES
14C machine (x86)
现在对system32
目录下的DLL执行dumpbin:
dumpbin /headers c:\windows\system32\odbc32.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。上面的代码片段不需要特殊的引用就可以工作——它只使用了 net 框架中内置的 ODBC 部分。
我正在尝试通过注册表以编程方式创建 ODBC 连接。
当使用 Windows ODBC 工具时,我注意到对于 ODBC 32,"Microsoft Access Driver (*.mdb)" 使用 odbcjt32.dll 并且注册表中的条目将指向此位置:
"Driver"="C:\Windows\system32\odbcjt32.dll"
但是当我搜索文件时,它存在,但位于其他文件夹中:
C:\Windows\SysWOW64
我需要知道原因,因为:
- 我需要从 C# 创建连接,我想我应该像 ODBC 工具那样把条目放到 C:\Windows\system32
- 我想从 C# 检查这个 DLL 版本,所以我应该检查 C:\Windows\SysWOW64\odbcjt32.dll ??
在 Windows 中有此 DLL 的魔术重定向?
感谢您的澄清,
有关 SysWoW64 和 system32 的一些背景信息,请参阅 the super user question "System32 and SysWOW64 on Windows 7"。所以是的,在 windows 上有一个 "magic redirection" 用于 32 位和 64 位 DLL。
C:\Windows\SysWOW64 中的文件 odbcjt32.dll 是 32 位版本。对于 32 位程序,路径 C:\Windows\system32\ 被重定向到 C:\Windows\SysWOW64\。您的程序当前的解决方案平台是什么? x86、x64 或任何 CPU?我觉得应该是x86的,这样才可以用32位的驱动。
看看 Environment.GetFolderPath
方法 Environment.SpecialFolder.SystemX86
这样你就不需要硬编码路径了。
有关魔术重定向的其他信息
要查看 DLL 的位数,您可以使用 dumpbin
。我在下面的示例中使用 "odbc32.dll"。打开你的 Visual Studio 版本的 Developer Command Prompt
并执行以下命令:
dumpbin /headers c:\windows\syswow64\odbc32.dll
输出将包含以下行:
FILE HEADER VALUES
14C machine (x86)
现在对system32
目录下的DLL执行dumpbin:
dumpbin /headers c:\windows\system32\odbc32.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。上面的代码片段不需要特殊的引用就可以工作——它只使用了 net 框架中内置的 ODBC 部分。