0

嗨,我对这段代码有疑问,因为它似乎总是返回 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);
4

2 回答 2

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");   
}
//...
于 2012-05-31T08:53:17.553 回答
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();
于 2012-05-31T09:14:59.573 回答