使用UCanAccess连接Access 2016数据库时触发数据类型转换不兼容错误
UCanAccess连接Access 2016数据库时触发数据类型转换不兼容错误
看起来你在使用UCanAccess连接本地Access 2016数据库时,卡在了建立连接的阶段——还没执行任何查询就触发了数据类型转换不兼容的错误,我来帮你梳理下可能的原因和解决办法。
首先明确你的问题场景:
我尝试将Java SE项目连接到本地的Access 2016数据库,但在建立连接的第15行就触发了如下错误:
net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::5.0.1 incompatible data types in conversion at net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:231) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677) at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:251) at lib.ConectarAccess.main(ConectarAccess.java:15) Caused by: java.sql.SQLSyntaxErrorException: incompatible data types in conversion at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) at org.hsqldb.jdbc.JDBCUtil.throwError(Unknown Source) at org.hsqldb.jdbc.JDBCPreparedStatement.setParameter(Unknown Source) at org.hsqldb.jdbc.JDBCPreparedStatement.setObject(Unknown Source) at net.ucanaccess.converters.LoadJet.execInsert(LoadJet.java:1527) at net.ucanaccess.converters.LoadJet.access$900(LoadJet.java:74) at net.ucanaccess.converters.LoadJet$TablesLoader.loadTableData(LoadJet.java:861) at net.ucanaccess.converters.LoadJet$TablesLoader.loadTableData(LoadJet.java:837) at net.ucanaccess.converters.LoadJet$TablesLoader.loadTablesData(LoadJet.java:1029) at net.ucanaccess.converters.LoadJet$TablesLoader.loadTables(LoadJet.java:1077) at net.ucanaccess.converters.LoadJet$TablesLoader.access$3200(LoadJet.java:264) at net.ucanaccess.converters.LoadJet.loadDB(LoadJet.java:1579) at net.ucanaccess.jdbc.UcanaccessDriver.connect(UcanaccessDriver.java:218) ... 3 more Caused by: org.hsqldb.HsqlException: incompatible data types in conversion at org.hsqldb.error.Error.error(Unknown Source) at org.hsqldb.error.Error.error(Unknown Source) at org.hsqldb.types.DateTimeType.convertJavaToSQL(Unknown Source) ... 14 more我已经尝试过对数据库执行“压缩和修复”操作,但问题依然存在。我的连接代码如下:
public class ConectarAccess { public static void main(String[] args) { String rutaDb= "C:\\Users\\Carl\\Documents\\Clientes.accdb"; String url = "jdbc:ucanaccess://"+ rutaDb; try { Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); Connection conexion = DriverManager.getConnection(url); //Statement st = conexion.createStatement(); } catch (Exception e) { e.printStackTrace(); } } }我的数据表包含以下字段:
- ID:自动编号(主键)
- Nombre:短文本
- Apellido:短文本
- Telefono:短文本
- Email:短文本
- FechaRegistro:日期/时间
- Direccion:长文本
- Ciudad:短文本
- Pais:短文本
- Activo:是/否
可能的解决方向
从错误栈能看出来,问题出在UCanAccess把Access数据库转成内部HSQLDB临时库的过程中,具体是日期/时间类型字段的转换失败,给你几个实操的排查方案:
重点检查日期字段的异常值
先打开你的Access数据库,盯着FechaRegistro这个日期字段看:- 有没有超出常规范围的日期?比如早于1000年或者晚于9999年的,虽然Access支持,但UCanAccess处理这类边缘值可能出问题
- 有没有“0000-00-00”这种Access本身不允许,但可能通过外部导入进来的无效零日期
- 有没有手动输入的非日期内容?比如字符串、奇怪的符号之类的
找到这些异常值后,改成合法的日期(比如空值或者符合格式的日期),再测试连接试试。
升级UCanAccess版本
你现在用的是UCanAccess 5.0.1,这个版本可能存在一些日期转换的bug。建议你去官网下载最新的稳定版(比如5.0.4或者更高),替换掉项目里的旧依赖,新版本通常会修复不少兼容性问题,说不定就能解决这个报错。彻底重建数据库文件
有时候“压缩和修复”只能解决小问题,你可以试试彻底重建数据库:- 新建一个空白的Access 2016数据库文件
- 把原数据库里的所有表结构和数据导入到新库(别直接复制原文件,要走Access的导入功能)
- 用你的Java代码连接这个新数据库,看看问题是不是消失了
定位具体的问题表
如果你的数据库不止这一个表,可以先做个测试:新建一个只包含这个用户表的测试库,连接看看会不会报错;如果不会,再逐个添加其他表测试,直到找到触发错误的表,这样就能精准定位到是哪个表的哪个字段出问题了。
备注:内容来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

