在无 DSN 连接的连接字符串中指定 Microsoft ODBC for Oracle(32/64 位)的版本(Access 2013(32 位))

Specifying version of Microsoft ODBC for Oracle (32/64 bit) in connection string for DSN-less connection (Access 2013 (32 bit))

每个

http://www.accessmvp.com/djsteele/DSNLessLinks.html

我试图用 无 DSN 连接替换 Access 中 DSN 创建的 table defs。

尝试 Microsoft 的驱动程序失败:

用于 Oracle 的 Microsoft ODBC

因为这个具体问题:

https://support.microsoft.com/en-us/kb/942976

在 Windows7 64 位上,如果要使用 Access 2013 32 位[=45,则必须使用 32 位 ODBC 管理面板管理 ODBC 驱动程序 (DSN) =].

但是,这并没有解决问题,因为我首先尝试去 DSN-less

我假设连接不起作用的原因是 Windows 是 "helpfully" 在我将其用作连接字符串时选择 64 位版本的驱动程序:

strConnectionString = _
    "ODBC;DRIVER={Microsoft ODBC for Oracle};" & _
    "Server=" & ServerName & ";" & _
    "UID=" & UID & ";" & _
    "PWD=" & PWD & ";"

问题是我无法指定我想要 32 位版本的驱动程序,因为 两个版本(32 和 64)都有同名.

有办法解决这个问题吗?

谢谢, 乍得

没有令人困惑的问题,因为“进程内”x32 程序只会加载和使用 x32 驱动程序。而“进程内”x64 位程序只会加载和使用 x64 驱动程序。它们可以具有相同的名称,但它们安装在 OS.

上的不同位置

如果您阅读了 linked 文章,简单的解决方案是始终启动正确版本的 ODBC 管理器。最简单的方法是从访问内部创建 link,因为访问将始终启动正确的 ODBC 管理器。

归根结底,由于您较少使用 DSN,这进一步意味着您使用的 link 与您的问题无关。

因此,虽然驱动程序可能具有相同的名称,但 OS 和软件只能使用相同位大小的软件,因此您的情况将使用相同的软件。

您要检查的唯一问题是,在 Access 中,您要从导入和 link ODBC 管理器启动外部数据选项卡。那时你 link 一个单一的 table 到 oracle 使用那个管理器然后访问将抓取(复制)那个连接字符串。并且您注意到如果没有显示 oracle 驱动程序,那么您必须安装 oracle 驱动程序(但可能 oracle 驱动程序已经存在)。

然后在验证 link 工作后,只需按 ctrl-g 跳转到调试 window,并使用此命令显示连接字符串设置:

? currentdb.TableDefs("table I just linked").连接

然后您会看到使用的连接字符串,并且将显示 oracle 驱动器的 name/syntax – 这就是您在连接字符串中使用的内容。

我还应该指出,当从 Access 启动 ODBC 管理器时,“默认”选项卡是“文件数据源”——这将始终在 Access 中创建 DSN less 连接。因此默认情况下,Access 将始终使用并创建无 DSN 连接。文件数据源仅在创建时使用。一旦你创建了 linked table 然后你可以将数据库移动到另一台计算机并且 table link 将继续正常工作,因为使用 DSN 访问links 默认情况下(因此信息被“复制”到 table def 连接字符串 linked table – 从那个点开始的原始文件数据源您通过 ODBC 面板保存的内容将被忽略且不会被使用。

底线: 这些文章的所有 link 都不重要,也不是您的问题。您只需使用 Access to oracle 中的 GUI 创建一个 linked table。如果可行,那么只需按照上面的方法查看 linked table 的连接字符串,它将 show/display 您需要使用的正确驱动程序字符串。

您可以在注册表中检查的驱动程序位置。如果是 x86(32 位),请检查 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\Microsoft ODBC for Oracle\Driver。最有可能的值应该是 %WINDIR%\system32\msorcl32.dll

现在,如果您 运行 像您的 MS Access 文件夹 %WINDIR%\system32\ 这样的 x86 应用程序会自动重定向到 %WINDIR%\SysWoW64\(请参阅 WoW64),因此您(或 MS Access)将在文件夹 c:\Windows\SysWOW64\.

中找到文件 msorcl32.dll

原则上,对于 x64,您必须检查注册表值 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\Microsoft ODBC for Oracle\Driver,但是 Microsoft ODBC Driver for Oracle 是 deprecated and available only for 32 bit! In case you need a 64 bit version you have to download and install ODBC driver from Oracle

使用 32 位 ODBC 驱动程序,您的 32 位 Access 应该可以正常工作。

这是问题及其解决方法:

可能在 Access 97 (.mdb) 中启动的遗留系统当前采用 Access 2013 (.accdb) 格式。 (我们没有预算在明年之前重新平台化系统)

Oracle 数据源有数百个 linked ODBC table,但实际使用的只有一小部分。只有 15 个 table 被直接使用或随后被其他 .accdb 数据库 link 编辑。


问题的根源 是 table 中的四个是使用现在丢失的 DSN、丢失或过时的用户创建的id,或者密码错误。

用户会在他们的一个进程中看到 "ODBC link failed" 消息,并且必须去 linked table 经理并通过 table 的名称来解决问题找出要重新 link 的那些。 (通常他们会 select 所有 200 个)。

然后系统会提示他们更新 DSN/UID/PWD。

当然,这样做时,Access 2013 不会将该信息保存到 tabledefs... 所以每次用户都会尝试 运行 他们的进程,他们会再次看到 ODBC 失败消息。

解决方案 删除并重新添加 四个 linked table最新的 DSN。

我还在主窗体上为他们添加了一个按钮,通过 ODBC linked tables(只有 15 个)和 运行 TableDef(_TABLENAME_).RefreshLink 在 table def 上。


感谢 Albert 和 Wernfried 的见解。

(我希望成为重新构建系统平台的团队的一员,使其全部存在于 SQL 服务器 and/or Oracle(后端)中,前端位于 HTML 5 明年,所以这是一个很好的止损)。