ResultSet未正确定位,也许您需要调用next

时间:2012-05-31 08:42:12

标签: java sql

您好我有这个代码的问题,因为它似乎总是返回SQL异常。它工作了几个然后停止并回来了例外。所以我不确定是什么问题。 我试图将vld.close()改为不同的地方,所以是的。感谢

PreparedStatement vld = conn.prepareStatement("SELECT * FROM carsharing.available(?,?,?,?)");
        vld.setString(1, carName);
        vld.setString(2, memberUser);
        vld.setTimestamp(3, new java.sql.Timestamp(startTime.getTime()));
        vld.setTimestamp(4, new java.sql.Timestamp(endTime.getTime()));
        System.out.println("test1");
        ResultSet rset = vld.executeQuery();
        System.out.println("test2");
        rset.next();
        int num = rset.getInt("num");
        boolean valid = rset.getBoolean("aval");
        vld.close();
        System.out.println(num);
        System.out.println(valid);

2 个答案:

答案 0 :(得分:2)

1)验证SQL

首先验证SQL是否正确?这对我来说看起来不正确。您现在尝试执行的是以下SQL:

SELECT * FROM carsharing.available(?,?,?,?)

如果要按给定名称限制结果集,则用户和时间戳SQL应如下所示:

SELECT * FROM carsharing WHERE carNameField=? AND memberUserField=? AND tsField1=? AND tsField2=?

使用正确的架构列名替换字段名称的位置。

2)结果集导航

然后,当你在执行后得到你的结果集时,你可以使用first()导航到第一个位置,它也会返回布尔值,这样你就可以检查是否有结果可用。如果你想要获取更多的值,你需要一个循环。

//...
ResultSet rset = vld.executeQuery();
if( rset.first()){
   int num = rset.getInt("num");
   boolean valid = rset.getBoolean("aval");   
}
//...

答案 1 :(得分:0)

你需要迭代结果集。你不能这样     rset.next(); 代码是

ResultSet rset = vld.executeQuery();
System.out.println("test2");
while(rset.next()) {
  int num = rset.getInt("num");
  boolean valid = rset.getBoolean("aval");
  System.out.println(num);
  System.out.println(valid);
}
vld.close();