在java中获取无效的游标状态exception

我运行了select命令并使用下面的代码在system.out中打印结果。 无效的游标错误导致预期结果。 请问任何一个人告诉我,为什么在打印预期结果后发生了这个错误以及如何修复它? 码:

try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + "path"; conn = DriverManager.getConnection(url); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); String select="SELECT DISTINCT col1,col2 FROM Tablename"; ResultSet rs = stmt.executeQuery(select); ResultSetMetaData rsmd = rs.getMetaData(); int columnsNumber = rsmd.getColumnCount(); String columnValue; while (rs.next()) { for (int i = 1; i <= columnsNumber; i++) { columnValue= rs.getString(i); System.out.print(columnValue+" "); } } } catch(SQLException exc){ exc.printStackTrace(); } output: test1 result1 test2 result2 test3 result3 java.sql.SQLException: [Microsoft][ODBC Driver Manager] Invalid cursor state at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6964) at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7121) at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(JdbcOdbc.java:3914) at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(JdbcOdbcResultSet.java:5697) at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:353) 

我能够重新创建你的问题。 在使用SELECT DISTINCT ...查询和ResultSet.TYPE_SCROLL_SENSITIVE时,它似乎是JDBC-ODBC Bridge和Access ODBC驱动程序的“不幸行为”。

以下kluge似乎解决了这个问题:

 String select="SELECT * FROM (SELECT DISTINCT FirstName,LastName FROM Clients)"; 

ResultSet.TYPE_SCROLL_SENSITIVE切换到ResultSet.TYPE_FORWARD_ONLY也可以避免此问题。

但是,由于JDBC-ODBC Bridge已过时且已从Java 8中删除,因此您可以考虑使用UCanAccess JDBC驱动程序。 有关详细信息,请参阅

在没有ODBC的情况下从Java操作Access数据库