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

Posted

技术标签:

【中文标题】ucanaccess SQL 异常:游标状态无效:已识别游标未打开【英文标题】:ucanaccess SQL Exception: invalid cursor state: identified cursor is not open 【发布时间】:2018-02-11 13:50:50 【问题描述】:

我有点迷茫,

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

我不明白为什么调用2nd insertRow()方法时会抛出上述(检查标题)SQL Exception

调用 con.setAutoCommit(false);con.commit(); 方法或使用命令 rs = st.executeQuery(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】:

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

您遇到的问题可能不会在con.setAutoCommit(false); 中体现出来,因为触发器可能不会在提交 JDBC 事务之前将更改刷新到 Access 数据库。

【讨论】:

以上是关于ucanaccess SQL 异常:游标状态无效:已识别游标未打开的主要内容,如果未能解决你的问题,请参考以下文章

SQL.fetchall() 使用 Python 失败,出现 SQLState 24000(无效游标状态)

java.sql.SQLException:游标状态无效:标识符游标未定位在 UPDATE、DELETE、SET 或 GET 语句中的行上:;结果集为空

[Microsoft][ODBC Driver Manager] 游标状态无效

通过 UCanAccess 插入时出现“强制转换的字符值无效”错误

PL/SQL 异常 ORA-06511 游标已打开

是啥导致了这个“无效的游标状态”错误?