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] 游标状态无效