如何从64位JVM连接到32位Access数据库?

4

到目前为止,当我需要连接一个32位的Access数据库时,我只需使用32位JVM执行应用程序即可。然而,我现在正在开发一个需要64位JVM的应用程序,但我仍然需要连接到一个32位的Access数据库。当我尝试连接时,我会得到以下异常:

java.sql.SQLException: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcConnection.initialize(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)

这是我的代码:
String s = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + path;
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn = DriverManager.getConnection(s, user, password);

看看这篇文章,它似乎是一个类似的问题https://dev59.com/P0_Ta4cB1Zd3GeqPC7B4。具体来说,请查看最后一个答案,其中提到从Microsoft安装64位MS Access Redistributable包。 - mazaneicha
有时候也可能是用户账户,参见http://stackoverflow.com/a/36793611/808723。 - GameScripting
3个回答

9
根据我的经验,对于用户(或系统?)ODBC DSN,有单独的32位和64位定义。我想你可能有一个32位的定义,但是Java ODBC桥正在寻找64位的定义。你不能直接从64位程序连接到32位Access ODBC驱动程序(如果你尝试会出现错误提示)。
虽然Microsoft在Windows(32位和64位)中分发32位ODBC Microsoft Access驱动程序,但它不会在Windows 64位中分发64位MsAccess驱动程序。Microsoft提供了一个64位Access ODBC驱动程序。下载和安装64位MsAccess驱动程序存在一些问题。
  • 我在使用Java 6(64位)测试时,Java / Driver只能间歇性地工作;我没有用Java 7进行过测试。对于Java 6,如果字符串字段位于SQL select语句的末尾,则可以正常工作。我发现某些SQL语句可行,而其他一些则不行。
  • 使用32位驱动程序,您知道驱动程序的确切位置,而使用64位驱动程序,您不知道它将被安装在哪里。这使得编写自动化安装脚本变得困难。
  • 您还需要创建单独的64位ODBC定义。

    ===============================================

另外,可能可以在32位Java中运行某个数据库代理/池包(并通过TCP/IP连接?)。不过我从未尝试过。

Java 64 -->> DB代理运行32位Java DB -->> Ms Access

数据库代理列表:http://www.manageability.org/blog/stuff/jdbc-proxy-drivers

类似SSL-SQL-代理服务器的东西可能会起作用。

祝你好运,希望有人能为你提供解决方案。


自原始答案以来,出现了2个JDBC驱动程序

开源:http://ucanaccess.sourceforge.net/site.html

商业:http://www.csv-jdbc.com/stels_mdb_jdbc.htm

我都没有尝试过。


编辑:2014年5月8日

看起来有更多的商业驱动程序 Easysoft DriverHXTT Driver

这篇文章可能会有用


2016年1月6日编辑

正如Gord Thompson所说,ODBC-Bridge已经从Java 8中删除。好消息是UCanAccess正在积极开发,并且他们似乎正在稳步取得进展。


我确认Bruce所说的关于64位Microsoft Access ODBC驱动程序在与Java一起使用时存在的问题。它似乎非常有缺陷,而且出奇地在互联网上几乎没有相关信息。我也遇到了列顺序似乎很重要的问题。我切换回32位ODBC驱动程序(这也意味着切换回32位JVM),现在一切都正常了。 - kaliatech

2
现在,由于JDBC-ODBC桥已经从Java 8中删除,所有关于Access ODBC的问题将逐渐成为过去式,需要使用“真正”的JDBC驱动程序。
如早期答案所提到的那样,UCanAccess是一种免费的开源选择。它是一个纯Java实现,根本不使用ODBC,因此无论平台(Windows,Linux等)或体系结构(32位或64位),都可以使用它。
有关如何使用UCanAccess的更多信息,请参见相关问题here

-1
问题是你应该在Java 32位上运行,尝试安装最新的JDK,它就能正常工作了。
我使用的JDK版本是"jdk-7u67-windows-i586.exe"。

这并没有回答问题,OP明确表示该应用程序需要一个64位的JVM。 - abiessu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接