0

我正在尝试编写 java 代码来访问具有列“customer_id”、“email”、“deliverable”和“create_date”的表“customer”

我有

        Connection conn = DriverManager.getConnection(connectionUrl, connectionUser, connectionPassword);
        Statement constat = conn.createStatement();
        String query = "SELECT * FROM customer WHERE customer_id LIKE " + customerId;
        ResultSet rtn = constat.executeQuery(query);
        Customer cust = new Customer(rtn.getInt("customer_id"), rtn.getString("email"),  rtn.getInt("deliverable"), rtn.getString("create_date"));
        conn.close();
        return cust;

我收到错误:

java.sql.SQLException:结果集开始之前

据我所知,我的错误在于我正在创建一个新的 Customer 对象,但我无法弄清楚我做错了什么。谁能给我一些帮助?谢谢!

4

3 回答 3

1

resultSet.next()在访问该行的数据之前,您必须始终通过调用(并检查它是否返回 true)转到下一行:

Customer cust = null;
if (rtn.next()) {
    cust = new Customer(rtn.getInt("customer_id"), 
                        rtn.getString("email"), 
                        rtn.getInt("deliverable"), 
                        rtn.getString("create_date"));
}

请注意,您还应该

  • 使用准备好的语句而不是字符串连接来避免 SQL 注入攻击,并拥有更健壮的代码
  • 在 finally 块中关闭连接、语句和结果集,或者如果使用 Java 7,则使用 try-with-resources 构造

阅读JDBC 教程

于 2012-05-09T17:07:21.700 回答
0

您应该调用ResultSet.first()将结果移动到第一个位置。结果集是一种编程约定,不检索查询的整个结果并保存在内存中。因此,它的接口是相当低级的,您必须通过类似的方法显式选择行first()last()或者next()(每个返回true以检查请求的行索引是否在集合中)

于 2012-05-09T17:10:15.650 回答
0

您需要添加

rtn.next();

在使用结果集之前。

通常这是这样做的

while (rtn.next()) {
  <do something with the row>
}
于 2012-05-09T17:10:48.893 回答