Java UCanAccess:打开和关闭必需字段以防止完整性约束冲突:非空错误
我正致力于将Java与旧的Access数据库连接起来,因为这就是我要问的 我不断得到错误:Java UCanAccess:打开和关闭必需字段以防止完整性约束冲突:非空错误,java,ms-access,jdbc,hsqldb,ucanaccess,Java,Ms Access,Jdbc,Hsqldb,Ucanaccess,我正致力于将Java与旧的Access数据库连接起来,因为这就是我要问的 我不断得到错误: integrity constraint violation: NOT NULL error 但是当我进入数据库时,我发现很多字段在一个必填字段中实际上是空的。我猜必填字段是后来添加的。当我将字段设置为not required时,我的代码工作正常 它是必需的,以便输入数据的人不会忘记它,但同时,有20000多条记录没有这个字段,因为我猜这是最近添加的 是否有一种方法可以通过UCanAccess从jav
integrity constraint violation: NOT NULL error
但是当我进入数据库时,我发现很多字段在一个必填字段中实际上是空的。我猜必填字段是后来添加的。当我将字段设置为not required时,我的代码工作正常
它是必需的,以便输入数据的人不会忘记它,但同时,有20000多条记录没有这个字段,因为我猜这是最近添加的
是否有一种方法可以通过UCanAccess从java打开和关闭此表的必填字段?我想这可能不太理想,最好关闭它,在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数据库可能有一个实际包含一些空值的NOTNULL列 UCanAccess用作后台数据库的HSQLDB不允许这样做。因此,UCanAccess开发团队需要找到协调这两种行为的方法。他们不想完全忽略NOTNULL约束,原因与您在问题中引用的相同,但他们也不想强迫用户更改该表中的数据,如果他们只想读取该数据 他们实施的折衷方案是,如果发现表的NOT NULL列中有NULL值,则会发出警告,并将该表设置为只读,以便UCanAccess可以安全地忽略NOT NULL约束: 警告:检测到非空约束违反,表2,记录…:将表2设置为只读 如果您只想从该表中读取,那么您可以忽略该警告。如果需要写入该表,则需要修复NOTNULL列中的数据 UCanAccess无法支持ALTER TABLE语句,因此无法更改现有列的[NOT]NULL状态 根据您的屏幕截图,相关字段的Allow Zero Length=Yes,因此您只需在Access中打开数据库,并使用 UPDATE TableName SET FieldName=其中FieldName为空 应用该更改后,UCanAccess将能够更新该表