【问题标题】:Specifying version of Microsoft ODBC for Oracle (32/64 bit) in connection string for DSN-less connection (Access 2013 (32 bit))在无 DSN 连接的连接字符串中指定 Microsoft ODBC for Oracle(32/64 位)的版本(Access 2013(32 位))
【发布时间】:2016-10-10 19:56:26
【问题描述】:

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

我已尝试将 Access 中 DSN 创建的表定义替换为 无 DSN 连接。

尝试 Microsoft 的驱动程序时运气不佳:

Microsoft ODBC for Oracle

因为这个特定的问题:

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

在 Windows 7 64 位上,如果您想使用 Access 2013 32 位,您必须使用 32 位 ODBC 管理面板管理 ODBC 驱动程序 (DSN)。

但是,这并不能解决问题,因为我首先尝试无 DSN

我认为连接不起作用的原因是当我将其用作连接字符串时,Windows 正在“帮助”选择 64 位版本的驱动程序:

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

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

有没有办法解决这个问题?

谢谢, 乍得。

【问题讨论】:

    标签: oracle ms-access vba odbc ms-access-2013


    【解决方案1】:

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

    现在,如果您运行 x86 应用程序,例如您的 MS Access 文件夹 %WINDIR%\system32\ 会自动重定向到 %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,仅适用于 32 位! 如果您需要 64 位版本您必须下载并安装 ODBC 驱动程序from Oracle

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

    【讨论】:

    • 感谢您的评论。我决定解决我们遇到的问题,而不是尝试无 DSN。旧版 Access 系统中有大约 200 个链接表,其中许多已不再使用。我们没有预算在明年之前推进系统的重新平台。我的任务是通过自动重新链接 ODBC 源(多个)但仅针对少数表来帮助用户处理不断丢失的 ODBC 链接的恼人问题。我可以利用 DSN,但有时表的连接会返回 3151 错误。在这一点上,我只需要(ct'd)......
    • ...能够弹出 ODBC 驱动程序 DSN 选择对话框,以便当链接表出现 3151 错误时,用户可以重新选择他们的机器 DSN 并重新链接表。这是我面临的唯一问题......而且我发现很难让机器 DSN 对话框从代码中弹出,然后通过再次询问密码/UID 来修复链接。
    • 如果您有一个正在使用的连接并且您“丢失”了该连接(链接表),那么您必须重新启动应用程序。重新链接到已经工作的同一个表将尝试使用刚刚断开的连接。
    【解决方案2】:

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

    如果您阅读了链接的文章,简单的解决方案是始终启动正确版本的 ODBC 管理器。最简单的方法是从 access 内部创建链接,因为 access 总是会启动正确的 ODBC 管理器。

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

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

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

    然后在验证链接是否有效后,只需按 ctrl-g 即可跳转到调试窗口,并使用以下命令显示连接字符串设置:

    ? currentdb.TableDefs("我刚刚链接的表").Connect

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

    我还应该指出,当从 Access 启动 ODBC 管理器时,“默认”选项卡是“文件数据源”——这将始终在 Access 中创建无 DSN 连接。因此,默认情况下 Access 将始终使用并创建无 DSN 连接。文件数据源仅在创建时使用。创建链接表后,您可以例如将数据库移动到另一台计算机,并且表链接将继续正常工作,因为 Access 默认使用 DSN 链接(因此信息被“复制”到表 def 连接字符串对于该链接表 - 从那时起您通过 ODBC 面板保存的原始文件数据源将被忽略且未使用。

    底线: 所有这些文章的链接都无关紧要,也不是您的问题或问题。您只需使用 Access to oracle 中的 GUI 创建一个链接表。如果可行,那么只需按照上述方法查看该链接表的连接字符串,它将显示/显示您需要使用的正确驱动程序字符串。

    【讨论】:

    • 在“外部数据”功能区中使用“ODBC 数据库”选项创建文件 DSN 时...如果我使用 Microsoft ODBC for Oracle 驱动程序,则会出现以下错误:'保留错误(- 7778);没有针对此错误的消息。如果我使用 Oracle 驱动程序(instantclient_12_1 中的 Oracle),它不会连接。 'ODBC——调用失败。由于系统错误 127,无法加载指定的驱动程序:找不到指定的过程(Oracle in instantclient_12_1;驱动程序 dll 的路径)。 (#160)' 似乎只有机器 dsns 可以工作。
    • 从 Access 启动 ODBC 面板很好(这可确保您始终使用正确的 ODBC 设置屏幕。我将从他们的站点删除并重新安装 x86 oracle 驱动程序,然后再次尝试重新链接表。我不明白为什么文件 DSN 不起作用。我会尝试退出 Access,然后右键单击 Access 快捷方式并选择以管理员身份运行,然后再次尝试 ODBC 设置。如上所述,尝试下载并重新安装 oracle驱动程序。文件或机器 DSN 无关紧要 - 但“文件”表示文件已保存 - 正如我指出的,文件要好得多,因为它总是创建一个 DSN 较少的连接
    • 谢谢。正如上面对 Wernfried 所提到的,我正在采用一种不同的方法来利用 DSN 本身。我需要能够克服的是重新链接 TableDef 时出现的 3151 错误。 Access 本身似乎通过弹出 DSN 选择对话框然后调用 ODBC 驱动程序在链接表管理器中执行此操作,该驱动程序打开它自己的 UID/PWD 对话框。我似乎无法让第二部分工作。它给了我一个 3146。
    【解决方案3】:

    这是问题及其解决方法:

    可能以 Access 97 (.mdb) 启动的旧系统,当前为 Access 2013 (.accdb) 格式。 (我们的预算要到明年才能重新构建系统)

    有数百个链接到 Oracle 数据源的 ODBC 表,但实际使用的只有少数。只有 15 个表被直接使用或随后被其他 .accdb 数据库链接。


    问题的根源是,其中四个表是使用现在缺失的 DSN、缺失或过期的用户 ID 或错误密码创建的。

    用户会在他们的一个过程中看到“ODBC 链接失败”消息,并且必须转到链接表管理器并通过表的名称来弄清楚要重新链接哪些表。 (通常他们会选择全部 200 个)。

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

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

    解决方案删除并重新添加具有最新 DSN 的四个链接表。

    我还在主窗体上为它们添加了一个按钮,该按钮通过 ODBC 链接表的缩短列表(其中只有 15 个)并为它们在表 def 上运行 TableDef(_TABLENAME_).RefreshLink


    感谢 Albert 和 Wernfried 提供的见解。

    (我希望成为团队的一员,该团队将系统重新平台化,以便明年在 SQL Server 和/或 Oracle(后端)中使用 HTML 5 中的前端,所以这是一个很好的停止间隙)。

    【讨论】:

      猜你喜欢
      • 2015-08-28
      • 2012-11-24
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      相关资源
      最近更新 更多