重置游标在 hsqlDB 中的位置,java
reset cursor position in hsqlDB, java
我正在使用嵌入到一个小程序中的 hsqlDB 2.3.2 版。到目前为止一切正常,我制作了一个简单的打印机方法,允许 mi 在控制台中打印结果集:
public static void printResultSet(ResultSet rs){
try {
if(rs==null || rs.wasNull()) {
System.out.println("#### empty result set ####");
return;
}
ResultSetMetaData rsmd = rs.getMetaData();
int cols = rsmd.getColumnCount();
System.out.println("############## Printers.resultset ################");
while(rs.next()){
System.out.println("");
for(int i=1; i<cols+1; i++){
try{
System.out.print(rs.getString(i) + ", ");
}catch(SQLException e){
/*drop silently - while it's a bad programming practice to rely on
* exceptions, it's easiest to handle when unknown data types may appear
*/
}
}
}
//rs.absolute(0); //reset rs cursor
rs.beforeFirst();
System.out.println("### DONE ### Printers.resultset ################");
} catch (SQLException e) {
System.err.println("SQL exceptin in Printers.printResultSet" + e.getMessage());
}
}
据我所知,rs.next() 导致结果集游标移动一个,直到其他东西改变它(可以是 next() 的下一次调用) .因此,打印机的调用导致光标在结果集的末尾结束,从而使我的代码的其他部分无法使用结果集。我正在尝试重置光标位置,以便可以在不对外部代码进行任何更改的情况下使用打印机方法,但由于某种原因我无法重置 -
rs.absolute(0);
也不
rs.beforeFirst();
有效。我收到异常消息 "feature not supported"
我在 javadoc 中找到一些参考资料,说当 JDBC 驱动程序不支持此操作时会发生这种情况。我有点震惊,因为不支持移动光标等非常重要的功能,我觉得很难相信,所以必须有一种不同的方法来重置光标位置,或者可能有替代 .next( ) 方法,允许在完成对所有内容的迭代后重置光标位置。
注意:.previous() 也不起作用,所以除了 next 之外的任何其他方法都会失败。
为了使其工作,语句对象必须声明为 ResultSet.TYPE_SCROLL_INSENSITIVE
:
Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
示例here
如果您使用 PreparedStetement
,请按如下方式使用:
PreparedStatement prepStmt =
dbCon.prepareStatement(sqlStr, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
FWIW 我解决了这个特别的失败:
if (rs.next()) {
rs.beforeFirst(); // this line blows up
while (rs.next()) {
...
改为切换到此模式:
if (rs.isBeforeFirst()) {
while (rs.next()) {
...
我正在使用嵌入到一个小程序中的 hsqlDB 2.3.2 版。到目前为止一切正常,我制作了一个简单的打印机方法,允许 mi 在控制台中打印结果集:
public static void printResultSet(ResultSet rs){
try {
if(rs==null || rs.wasNull()) {
System.out.println("#### empty result set ####");
return;
}
ResultSetMetaData rsmd = rs.getMetaData();
int cols = rsmd.getColumnCount();
System.out.println("############## Printers.resultset ################");
while(rs.next()){
System.out.println("");
for(int i=1; i<cols+1; i++){
try{
System.out.print(rs.getString(i) + ", ");
}catch(SQLException e){
/*drop silently - while it's a bad programming practice to rely on
* exceptions, it's easiest to handle when unknown data types may appear
*/
}
}
}
//rs.absolute(0); //reset rs cursor
rs.beforeFirst();
System.out.println("### DONE ### Printers.resultset ################");
} catch (SQLException e) {
System.err.println("SQL exceptin in Printers.printResultSet" + e.getMessage());
}
}
据我所知,rs.next() 导致结果集游标移动一个,直到其他东西改变它(可以是 next() 的下一次调用) .因此,打印机的调用导致光标在结果集的末尾结束,从而使我的代码的其他部分无法使用结果集。我正在尝试重置光标位置,以便可以在不对外部代码进行任何更改的情况下使用打印机方法,但由于某种原因我无法重置 -
rs.absolute(0);
也不
rs.beforeFirst();
有效。我收到异常消息 "feature not supported"
我在 javadoc 中找到一些参考资料,说当 JDBC 驱动程序不支持此操作时会发生这种情况。我有点震惊,因为不支持移动光标等非常重要的功能,我觉得很难相信,所以必须有一种不同的方法来重置光标位置,或者可能有替代 .next( ) 方法,允许在完成对所有内容的迭代后重置光标位置。
注意:.previous() 也不起作用,所以除了 next 之外的任何其他方法都会失败。
为了使其工作,语句对象必须声明为 ResultSet.TYPE_SCROLL_INSENSITIVE
:
Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
示例here
如果您使用 PreparedStetement
,请按如下方式使用:
PreparedStatement prepStmt =
dbCon.prepareStatement(sqlStr, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
FWIW 我解决了这个特别的失败:
if (rs.next()) {
rs.beforeFirst(); // this line blows up
while (rs.next()) {
...
改为切换到此模式:
if (rs.isBeforeFirst()) {
while (rs.next()) {
...