我有一个简单的代码来从MSSQL Server 2008中检索一个记录集,由于我设置了ResultSet.TYPE_SCROLL_INSENSITVE,因此必须可以滚动它,与Javadocs中的示例相同:
String qry = "SELECT * from tblPeople";
SQLConnection sql = new SQLConnection();
Statement stmt = sql.getConnection().createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(qry);
不幸的是,当我想得到像rs.last(); int rowCount = rs.getRow();
这样的行数时,我仍然得到了这个堆栈跟踪:
java.sql.SQLException: ResultSet may only be accessed in a forward direction.
at net.sourceforge.jtds.jdbc.JtdsResultSet.checkScrollable(JtdsResultSet.java:304)
at net.sourceforge.jtds.jdbc.JtdsResultSet.last(JtdsResultSet.java:551)
at test.personen.Main.main(Main.java:44)
为什么这样,我该如何修复它(顺便说一句,当我检查ResultSet的类型时,我得到1003 ..)?
答案 0 :(得分:4)
TYPE_SCROLL_INSENSITIVE
的组合很可能与CONCUR_UPDATABLE
不兼容。根据JDBC规范,如果驱动程序无法为请求的可滚动性和/或并发模式提供服务,则可以自由降级ResultSet
。另见:http://jtds.sourceforge.net/resultSets.html:
TYPE_SCROLL_INSENSITIVE |静态游标|重|仅适用于只读并发(可更新可降级)。 SQL Server生成临时表,因此其他人所做的更改不可见。滚动的。
这确认了在指定CONCUR_UPDATABLE
时驱动程序将降级。
您可能需要考虑使用TYPE_SCROLL_SENSITIVE
,或者根本不考虑将可滚动性与可更新性相结合。
答案 1 :(得分:1)
jTDS TYPE_SCROLL_INSENSITIVE仅支持只读操作。
将ResultSet.TYPE_SCROLL_INSENSITIVE更改为ResultSet.TYPE_SCROLL_SENSITIVE
请参阅http://www.anyang-window.com.cn/jtds-on-the-database-connection-resultset-is-read-only/