我想在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:无效的游标状态:插入前必须设置所有列


我的代码中缺少什么?

最佳答案

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

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

更新

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

关于java - 使用UCanAccess插入ResultSet时出现“必须在插入之前设置所有列”错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30026692/

10-11 17:40