UCanAccess:打开和关闭必填字段以防止违反完整性约束:NOT NULL 错误

UCanAccess: Set required field on and off to prevent integrity constraint violation: NOT NULL error

我正在努力将 Java 与旧的 Access 数据库连接起来,因为这是要求的。

我一直收到错误消息:

integrity constraint violation: NOT NULL error 

但是当我进入数据库时​​,我发现其中一个必填字段中有很多字段实际上为空。我猜必填字段是后来添加的。当我将该字段设置为不需要时,我的代码工作正常。

它需要是必需的,这样输入数据的人就不会忘记它,但与此同时,有超过 20000 条记录没有这个字段,因为它是最近添加的,我猜。

有没有办法使用 UCanAccess 打开和关闭来自 java 的 table 的必填字段?我猜它可能不理想,最好将其关闭,并在 Access 中的一个数据输入表单中创建一个检查以确保该字段被填充?解决这个问题的最佳方法是什么?不幸的是,除了 Java 和 Access 之外,我没有很多工具可以使用。我不确定最佳做法是什么。

这是我的代码(针对 public 进行了编辑),它确实有效:

    TimeEntry t = new TimeEntry();
    ArrayList<TimeEntry> tList = new ArrayList<TimeEntry>();
try{
            Connection conn=DriverManager.getConnection("jdbc:ucanaccess://\\server\folder1\folder2\folder3\folder4\folder5\Database21.mdb");
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery("SELECT [PLANT], [DEPARTMENT], [WONum] FROM [Query1] where [Entry-dt] >= #2/26/2016# ");
        while (rs.next()) {

            t.setPlant(rs.getString(1));
            t.setDept(rs.getString(2));
            t.setWo(rs.getString(3));
            System.out.println(t.toString());
            tList.add(t);
            t = new TimeEntry();

            System.out.println(rs.getString(3));
            }

        } catch(Exception e){

        }

Microsoft Access 允许现有记录在字段(列)从 "Required=No"(NULL 约束)转换为 "Required=Yes"(NOT NULL 约束)后保留 NULL 值。因此,Access 数据库可能有一个实际上包含一些 NULL 值的 NOT NULL 列。

UCanAccess 用作后备数据库的 HSQLDB 不允许这样做。因此,UCanAccess 开发团队需要找到一种方法来协调这两种行为。他们不想完全忽略 NOT NULL 约束(出于您在问题中引用的相同原因),但他们也不想强迫用户更改 table 中的数据,如果他们想要的话要做的就是阅读它。

他们实施的妥协是,如果发现 table 在 NOT NULL 列中具有 NULL 值,则会发出警告并将 table 设为只读(因此UCanAccess 可以安全地忽略 NOT NULL 约束):

WARNING:Detected Not Null constraint breach, table Table2, record ... : making the table Table2 readonly

如果您想做的只是阅读那个 table 那么您可以忽略警告。如果您需要写入 table,那么您需要修复 NOT NULL 列中的数据。

(UCanAccess 无法支持 ALTER TABLE 语句,因此它无法更改现有列的 [NOT] NULL 状态。)

根据您的屏幕截图,有问题的字段有 "Allow Zero Length=Yes",因此您只需在 Access 中打开数据库并使用

更新列
UPDATE TableName SET FieldName='' WHERE FieldName IS NULL

应用该更改后,UCanAccess 将能够更新 table。