重置hsqlDB中的光标位置,java
我正在使用hsqlDB版本2.3.2,我正在将其嵌入一个小程序中。到目前为止,一切都很顺利,我制作了一个简单的打印机方法,允许mi在控制台中打印结果集:重置hsqlDB中的光标位置,java,java,jdbc,hsqldb,Java,Jdbc,Hsqldb,我正在使用hsqlDB版本2.3.2,我正在将其嵌入一个小程序中。到目前为止,一切都很顺利,我制作了一个简单的打印机方法,允许mi在控制台中打印结果集: public static void printResultSet(ResultSet rs){ try { if(rs==null || rs.wasNull()) { System.out.println("#### empty result set ####");
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());
}
}
也不是
工作。我收到一个异常,其中包含一条脚本消息“功能不受支持”
我在javadoc中发现了一些引用,它们说当JDBC驱动程序不支持这个操作时就会发生这种情况。我有点震惊,像移动光标这样一个非常重要的功能不受支持,我觉得很难相信,因此必须有一种不同的方法来重置光标位置,或者可能有一种替代.next()方法,允许在遍历所有内容时重置光标位置
注意:.previous()也不起作用,所以除next之外的任何操作都会失败 为使其正常工作,必须将语句对象声明为
ResultSet。键入\u SCROLL\u INSENSITIVE
:
Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
范例
如果您使用的是preparedstement
,请如下使用:
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()) {
...
现在我有了PreparedStatement pst=con.prepareStatement(query,ResultSet.TYPE\u SCROLL\u不敏感);似乎已经做到了(我在其他地方有一个新的bug,需要对代码进行更多修改,但我认为结果集现在可以滚动了。谢谢
if (rs.next()) {
rs.beforeFirst(); // this line blows up
while (rs.next()) {
...
if (rs.isBeforeFirst()) {
while (rs.next()) {
...