Java UCanAccess:向带有附件的表插入新行时出现错误
经过几个小时的尝试和失败,我已经确定了UCanAccess在尝试将新行插入到碰巧有一个类型为Attachment的字段的表中时的奇怪行为 具体而言,我在Access中有一个简单的表,如下所示:Java UCanAccess:向带有附件的表插入新行时出现错误,java,ms-access,ucanaccess,Java,Ms Access,Ucanaccess,经过几个小时的尝试和失败,我已经确定了UCanAccess在尝试将新行插入到碰巧有一个类型为Attachment的字段的表中时的奇怪行为 具体而言,我在Access中有一个简单的表,如下所示: ID: Autonumber FirstName: String (not required) Age: Numnber (not required) Picture: Attachment (not required) 我使用以下代码使用Java和UCanAccess向表中添
ID: Autonumber
FirstName: String (not required)
Age: Numnber (not required)
Picture: Attachment (not required)
我使用以下代码使用Java和UCanAccess向表中添加一行:
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
String database = "jdbc:ucanaccess://" + dbFileName + "";
Connection conn = DriverManager.getConnection(database, "", "");
Statement s = conn.createStatement();
String sql = "INSERT INTO Test(FirstName, Age) VALUES ('TestName',32)";
s.execute(sql);
该代码产生以下错误:
java.lang.NullPointerException
at net.ucanaccess.commands.InsertCommand.persist(InsertCommand.java:153)
at net.ucanaccess.jdbc.UcanaccessConnection.flushIO(UcanaccessConnection.java:315)
at net.ucanaccess.jdbc.UcanaccessConnection.commit(UcanaccessConnection.java:205)
at net.ucanaccess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:217)
at net.ucanaccess.jdbc.Execute.execute(Execute.java:46)
at net.ucanaccess.jdbc.UcanaccessStatement.execute(UcanaccessStatement.java:152)
at projectmigrator.ProjectMigrator.tester2(ProjectMigrator.java:62)
at projectmigrator.ProjectMigrator.main(ProjectMigrator.java:43)
net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.1 null
at net.ucanaccess.jdbc.UcanaccessStatement.execute(UcanaccessStatement.java:154)
at projectmigrator.ProjectMigrator.tester2(ProjectMigrator.java:62)
at projectmigrator.ProjectMigrator.main(ProjectMigrator.java:43)
Caused by: net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.1 null
at net.ucanaccess.jdbc.UcanaccessConnection.commit(UcanaccessConnection.java:212)
at net.ucanaccess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:217)
at net.ucanaccess.jdbc.Execute.execute(Execute.java:46)
at net.ucanaccess.jdbc.UcanaccessStatement.execute(UcanaccessStatement.java:152)
... 2 more
Caused by: net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.1 null
at net.ucanaccess.jdbc.UcanaccessConnection.flushIO(UcanaccessConnection.java:348)
at net.ucanaccess.jdbc.UcanaccessConnection.commit(UcanaccessConnection.java:205)
... 5 more
Caused by: java.lang.NullPointerException
at net.ucanaccess.commands.InsertCommand.persist(InsertCommand.java:153)
at net.ucanaccess.jdbc.UcanaccessConnection.flushIO(UcanaccessConnection.java:315)
... 6 more
有趣的是,如果我将sql字符串替换为
String sql = "INSERT INTO Test(FirstName, Age, Photo) VALUES ('TestName',3224,'')";
在对包含不需要的附件类型字段的表执行INSERT时,我是否真的被迫提供一个伪值,如空字符串(对于数字或文本等其他类型的字段,情况并非如此)。这可能是UCanAcces中的一个bug,还是我遗漏了什么
(谢谢-我知道我应该使用PreparedStatement来插入语句,但为了这篇文章,我硬编码了插入语).此问题已在UCanAccess 4.0.2中修复。此问题已在UCanAccess 4.0.2中修复。已修复格式-希望帖子现在更容易阅读:)我可以重现此问题并将升级。请注意,此错误将在4.0.2中修复。找到的解决方法有效性有限,对于上述情况,最好使用UCanAccess网站上描述的方法来设置复杂的列值。4.0.2很快就要发布了。修复了格式-希望这篇文章现在更容易阅读:)我可以重现这个问题并将升级。注意,这个错误将在4.0.2中修复。找到的解决方法有效性有限,对于上述情况,最好使用UCanAccess网站上描述的方法来设置复杂的列值。4.0.2将很快推出。