You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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或者更高),替换掉项目里的旧依赖,新版本通常会修复不少兼容性问题,说不定就能解决这个报错。

  • 彻底重建数据库文件
    有时候“压缩和修复”只能解决小问题,你可以试试彻底重建数据库:

    1. 新建一个空白的Access 2016数据库文件
    2. 把原数据库里的所有表结构和数据导入到新库(别直接复制原文件,要走Access的导入功能)
    3. 用你的Java代码连接这个新数据库,看看问题是不是消失了
  • 定位具体的问题表
    如果你的数据库不止这一个表,可以先做个测试:新建一个只包含这个用户表的测试库,连接看看会不会报错;如果不会,再逐个添加其他表测试,直到找到触发错误的表,这样就能精准定位到是哪个表的哪个字段出问题了。

备注:内容来源于stack exchange,提问作者Carlos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:49:35