使用 UCanAccess 插入 ResultSet 时出现“必须在插入之前设置所有列”错误

Posted

技术标签:

【中文标题】使用 UCanAccess 插入 ResultSet 时出现“必须在插入之前设置所有列”错误【英文标题】:"all columns must be set before insert" error on a ResultSet insert with UCanAccess 【发布时间】:2015-05-04 09:25:36 【问题描述】:

我想在 Java 8 下使用 UCanAccess 创建一个 Access 数据库连接。这是我的代码:

String employeeName = endrollNameFields.getText();
String employeeAddress = endrollAddressFields.getText();        

try

    //------------CREATE CONNECTION TO DATA BASE--------------/

    String DBPAD = "sourceFolder\\employeeTable2.mdb";
    String DB = "jdbc:ucanaccess://" + DBPAD;                       


    con = DriverManager.getConnection(DB, "", "");
    st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    String sql = "select * from employeeTable2";


    rs = st.executeQuery(sql);                  

    rs.moveToInsertRow();

    rs.updateString("Name", employeeName);
    rs.updateString("Address", employeeAddress);                        

    rs.insertRow();
    st.close();             

    st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
    String sql1 = "select * from employeeTable2";
    rs = st.executeQuery(sql1);

    JOptionPane.showMessageDialog(null, "<html>" + "<font color=\"#008000\">" + "<html><span style='font-size:1.5em'>Employee Successfuly Inserted to Data Base");


catch(Exception e1)

    JOptionPane.showMessageDialog(null, e1);
           

我在我的 JTextField 中输入了条目,但是当我单击包含上面代码的按钮时,会出现此错误消息:

net.ucanaccess.jdbc.Ucanaccess SQLException:invalid cursor state: 所有列必须在插入前设置

我的代码中缺少什么或缺少什么?

【问题讨论】:

employeeTable2真的只包含两行吗? (姓名+地址)。 您为什么要通过结果集而不是通过insert 语句来执行此操作?正如斯蒂芬所说,您的表格可能比您设置的两个列更多。通过结果集插入时需要设置所有列。 【参考方案1】:

UCanAccess 使用 HSQLDB 作为“后备数据库”,并且 HSQLDB 要求在调用 .insertRow() 之前为插入行中的所有列指定一个显式值,包括使用 rs.updateNull("ColumnName") 显式指定一个 NULL 值。这就是它的工作方式。

最近在 SourceForge here 上对此进行了讨论。在 UCanAccess 的未来版本中可能会取消该要求。

更新

UCanAccess 3.x 版于 2015 年 8 月发布,确实删除了上述要求。任何未在插入行中显式设置的列都将包含该列的默认值(如果该列可以为空且表定义中未指定默认值,则为 NULL)。

【讨论】:

以上是关于使用 UCanAccess 插入 ResultSet 时出现“必须在插入之前设置所有列”错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Ucanaccess 中插入错误

使用 UCanAccess 插入 ResultSet 时出现“必须在插入之前设置所有列”错误

使用 UCanAccess 从大文本文件中插入数据非常慢

我正在尝试将一个简单的查询插入到 Microsoft 数据库中,并且我正在使用 UCanAccess

插入时的 JDBC PreparedStatement 默认值 (UCanAccess)

无法使用 Ucanaccess 3.0.6 将值插入 access 97。它显示访问是只读的