如何通过带DNS的UCanAccess访问32位ODBC驱动?
解决通过DSN访问32位ODBC驱动的问题(Java 11 + JavaFX环境)
一、核心澄清与限制说明
- UCanAccess是纯Java实现的Access数据库驱动,无需依赖ODBC驱动,可直接读写
.mdb/.accdb文件,不需要通过ODBC中间层。你提供的示例连接字符串jdbc:ucanaccess:pmg不符合UCanAccess标准格式,正确格式应为:jdbc:ucanaccess:///path/to/your/database.mdb;charset=utf-8 - Java 11已移除内置的JDBC-ODBC桥(
sun.jdbc.odbc.JdbcOdbcDriver),无法直接使用传统ODBC连接方式。若必须通过32位ODBC DSN访问,需借助第三方JDBC-ODBC桥驱动。
二、适配32位ODBC驱动的关键前提
ODBC驱动的位数必须与Java运行环境的位数严格匹配:
- 若当前Java 11是64位,只能加载64位ODBC驱动;若要使用32位ODBC驱动,需切换为32位Java 11。
- 验证Java位数:终端执行
java -version,查看输出中的位数标识(如64-Bit或32-Bit)。
三、方案1:直接使用UCanAccess连接数据库文件(推荐)
跳过ODBC DSN,直接用UCanAccess连接Access文件,避免ODBC兼容性问题:
- 引入UCanAccess依赖(Maven示例):
<dependency> <groupId>net.sf.ucanaccess</groupId> <artifactId>ucanaccess</artifactId> <version>5.0.1</version> </dependency> - 编写连接代码:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class AccessConnector { public static void main(String[] args) { String dbFilePath = "/path/to/your/pmg.mdb"; // 替换为实际数据库文件路径 String connUrl = "jdbc:ucanaccess://" + dbFilePath; try (Connection conn = DriverManager.getConnection(connUrl)) { System.out.println("数据库连接成功"); // 执行查询、更新等操作 } catch (SQLException e) { e.printStackTrace(); } } }
四、方案2:通过第三方JDBC-ODBC桥连接32位ODBC DSN
若必须使用ODBC DSN,可采用开源免费的JTOpen JDBC-ODBC Bridge:
- 下载适配32位Java环境的
jt400.jar,添加到项目类路径/模块路径中。 - 编写DSN连接代码:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class OdbcConnector { public static void main(String[] args) { String dsnName = "pmg"; String connUrl = "jdbc:odbc:" + dsnName; try { Class.forName("com.ibm.as400.access.AS400JDBCDriver"); // 加载桥驱动 try (Connection conn = DriverManager.getConnection(connUrl)) { System.out.println("ODBC DSN连接成功"); // 执行数据库操作 } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } } - 额外配置:确保32位ODBC数据源(DSN
pmg)是通过32位ODBC管理器创建的,路径为C:\Windows\SysWOW64\odbcad32.exe(仅适用于Windows系统)。
五、JavaFX环境适配注意事项
- 将驱动依赖(UCanAccess或JTOpen的jar包)正确添加到JavaFX项目的模块路径或类路径中。
- 若使用模块化JavaFX项目,需在
module-info.java中声明依赖:module your.module.name { requires java.sql; requires ucanaccess; // 使用UCanAccess时添加 // 使用JTOpen时添加 requires jt400; exports your.package.name; }
内容的提问来源于stack exchange,提问作者Charlo Poitras
相关产品推荐
相关产品推荐

