我正在使用hsqldb2.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()会导致resultset游标移动一次,直到有其他内容更改它(可以是next()的下一个调用)。因此,打印机的调用会导致光标结束在resultset的末尾,从而使代码的其他部分无法使用resultset。我正在尝试重置光标位置,以便在不更改外部代码的情况下使用打印机方法,但由于某些原因,我无法重置-打印机和
rs.absolute(0);
也不是
rs.beforeFirst();
作品。我收到一个脚本消息“功能不受支持”的异常
我在javadoc中发现了一些引用,指出当jdbc驱动程序不支持此操作时会发生这种情况。我有点震惊,一个非常重要的功能,如移动光标是不受支持的,我觉得很难相信,所以必须有一个不同的方法来重置光标位置,或者有一个替代的.next()方法,允许重置光标位置时,它完成了迭代的一切。
注意:.previous()也不起作用,因此除next之外的任何操作都将失败。
2条答案
按热度按时间yi0zb3m41#
为了使其工作,语句对象必须声明为
ResultSet.TYPE_SCROLL_INSENSITIVE
:这里举个例子
如果你使用
PreparedStetement
像这样使用:aemubtdh2#
fwiw我绕过了这个特殊的失败:
换成这种模式: