【问题标题】:Error while extracting from result set从结果集中提取时出错
【发布时间】:2016-01-01 04:20:55
【问题描述】:

我正在尝试从 mysql 表中获取数据。当我在 phpmyadmin 上手动运行查询时,我的查询返回一个值,但是当我从 Java 代码运行时,它给出了一个空集。这是查询:

SELECT real_name
from doctorlogin
where password='1234' and id='X11111X';

代码:

public ArrayList<ArrayList<String>> query(String statement) throws SQLException {
    ResultSet rs = stmt.executeQuery(statement);
    int numcols = rs.getMetaData().getColumnCount();
    ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
    if (rs.isBeforeFirst()) {
        do {
            ArrayList<String> row = new ArrayList<String>(); // new list per row
            int i = 0;
            while (i <= numcols) {  // don't skip the last column, use <=
                row.add(rs.getString(i++));
            }
            result.add(row); // add it to the result
        } while (rs.next());
    }

    return result;
}

public String login(String username, String password, String domain) throws SQLException {
    String query = "SELECT real_name from " + domain + "login where password='" + password + "' and id='" + username + "';";
    System.out.println(query);
    ArrayList<ArrayList<String>> r = query(query);

    if (r.size() > 1 || r.size() == 0)
        return "Login Failed";
    else
        return r.get(0).get(0);
}

进行编辑后,即使我在 phpmyadmin 中获得了一行,代码仍然没有获取任何结果。

public ArrayList<ArrayList<String>> query(String statement) throws SQLException {
    ResultSet rs = stmt.executeQuery(statement);
    int numcols = rs.getMetaData().getColumnCount();
    ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
    while ( rs.next() ) {
        ArrayList<String> row = new ArrayList<String>(); // new list per row
        for ( int i = 1; i <= numcols; i++ ) {
            row.add(rs.getString(i));
        }
        result.add(row); // add it to the result
    }
    return result;
}

phpmyadmin 查询截图 -> https://drive.google.com/drive/folders/0B_yqoCAAV2rFdDZqUzlmeXljNWs

【问题讨论】:

  • 什么是stracktrace?您是否尝试使用 rs.next() 而不是 if (rs.isBeforeFirst()) ?
  • 代码甚至没有进入while循环。
  • 您确定没有收到 SQLException 吗?
  • 是的..它没有给出任何异常。
  • 我添加了截图链接。由于声誉低,无法在此处发布照片。

标签: java mysql jdbc resultset


【解决方案1】:

在调用rs.next() 之前,您无法从行中检索信息。所以ResultSet 循环的通常格式很简单

while (rs.next()) {
    // Retrieve the column values
}

那里不需要if 语句。如果没有返回的行,if 为 false,您将返回一个空列表。但对于上面简单的while 也是如此。不需要do...while() - 您首先需要移动光标,然后才能读取值。

最后,列是从 1 开始索引的,而不是从 0 开始。因此您的 i 应该从 1 开始。但是为什么不将其替换为 for 循环而不是 while

while ( rs.next() ) {
     ArrayList<String> row = new ArrayList<String>(); // new list per row
     for ( int i = 1; i <= numcols; i++ ) {
         row.add(rs.getString(i));
     }
     result.add(row); // add it to the result
}

您应该阅读ResultSet documentation,因为信息都在那里。

【讨论】:

    【解决方案2】:
    row.add(rs.getString(i++));
    

    应该改为

    row.add(rs.getString(++i));
    

    因为0 行不可访问。行数从 1 开始。

    在第二个代码中,在从数据库中获取对象之前会增加,所以第一个值是1

    【讨论】:

      猜你喜欢
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      相关资源
      最近更新 更多