ucanaccess SQL异常:游标状态无效:标识的游标未打开

时间:2018-02-11 13:50:51

标签: java eclipse ms-access sqlexception ucanaccess

我有点困惑,

我正在尝试使用 ucanaccess Java库从java程序中向MS Access数据库插入多行

我不明白为什么在调用第二个insertRow()方法时抛出上面的(检查标题) SQL Exception

不会通过调用 con.setAutoCommit(false); & con.commit(); 方法或使用命令 rs = st.executeQuery(sql); 重新执行SQL查询。我也不明白为什么通过上面的一个来解决问题。 有什么变化?

提前致谢。

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class db1 {

    private Connection con;
    protected  Statement st;
    protected ResultSet rs;

    public db1() {
        connect();
    }

    public void connect() {

        try {
            String driver = "net.ucanaccess.jdbc.UcanaccessDriver";
            Class.forName(driver);

            String db = "jdbc:odbc:Database1";
            con = DriverManager.getConnection
          ("jdbc:ucanaccess://C:\\Users\\Κώστας\\Desktop\\Database1.accdb");
            st = con.createStatement
          (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE,
          ResultSet.HOLD_CURSORS_OVER_COMMIT)

          // con.setAutoCommit(false);

          String sql = "select * from TableA";  
          rs = st.executeQuery(sql);

          rs.insertRow();

          // rs = st.executeQuery(sql);

          rs.insertRow(); // HERE the SQL Exception is thrown.

          // con.commit();
    }
    catch (Exception e) {
        System.out.println(e);
    }
}
public static void main(String[] args) {
    new db1();  
}
}

1 个答案:

答案 0 :(得分:0)

UCanAccess存在可更新ResultSet的一些已知问题,因为它使用HSQLDB支持表上的触发器将更改推送到Access数据库文件。这些触发器的副作用是它们可能使HSQLDB ResultSet处于无效状态。

您遇到的问题可能无法与con.setAutoCommit(false);一起显示,因为触发器可能不会刷新对Access数据库的更改,直到提交JDBC事务为止。