使用 UCanAccess 创建表后,ms 访问未强制执行非空约束

Posted

技术标签:

【中文标题】使用 UCanAccess 创建表后,ms 访问未强制执行非空约束【英文标题】:Not null constraint not enforced by ms access after creating table with UCanAccess 【发布时间】:2018-01-17 18:05:57 【问题描述】:

这是this 问题的后续。现在的新 UCanAccess 版本的错误有点不同。

我使用最新的 UCanAccess(4.0.3,包括 Jackcess 2.1.9)像这样创建了一个包含 NOT-NULL 列的表的数据库文件

    // Create a database + connect
    DatabaseBuilder.create(FileFormat.V2010, new File(path));
    Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");     
    conn = DriverManager.getConnection("jdbc:ucanaccess://" + path + ";singleconnection=true" ,"", ""); 
    
    // Create table     
    String sql = "CREATE TABLE Test (id AUTOINCREMENT PRIMARY KEY, value CHAR(1) NOT NULL)";
    conn.createStatement().executeUpdate(sql);

尝试通过 UCanAccess 插入值可以正常工作,UCanAccess 按预期拒绝列“值”的 NULL。 但是,当我直接在 Access 中使用表时,接受 NULL!通过 UCanAccess 处理数据 稍后会导致问题,因为该表无法写入:

警告:检测到 Not Null 约束违反,表测试,记录 Row[87:1][id=2,value=]:使表 Test 只读

从 Access 中的设计视图打开和保存表可以解决问题,但从长远来看不是一个选项。 如何让 Access 尊重 NOT-NULL 约束?

【问题讨论】:

我能够重现您的问题。我会升级它并在这里报告任何更新。这可能是一个难以解决的问题,因为 Jackcess 确实设置了适当的“必需”列属性,但是当 Access 保存表定义时可能会发生一些其他的魔法(实际上 enforces NOT NULL 约束。 ) Jackcess 帮助论坛here也正在讨论这个问题。 【参考方案1】:

这已被追踪到带有 Jackcess 2.1.10 的 known issue。它应该分别在即将发布的 Jackcess 和 UCanAccess 版本中得到修复。

【讨论】:

以上是关于使用 UCanAccess 创建表后,ms 访问未强制执行非空约束的主要内容,如果未能解决你的问题,请参考以下文章

通过 UCanAccess 在 Eclipse 中“从表中生成实体”(MS Access)

使用 Java Ucanaccess 在 ms-Access 中恢复数据和存储的查询

使用 UCanAccess 的 MS Access '97 DB 字符集

如何通过 UCanAccess 创建一个包含两个外键引用到另一个表的表?

使用 UCanAccess / jackcess 作为 JDBC 到 MS Acess 数据库时出现 IncompatibleClassChangeError

未找到适用于 ucanaccess 的驱动程序