【问题标题】:MySQL: Out of range, but the column isn't last?MySQL:超出范围,但列不是最后一个?
【发布时间】:2014-03-07 20:48:31
【问题描述】:

在花了很长时间弄清楚我的代码出了什么问题后,我决定继续寻求帮助。截至目前,这是导致错误的代码:

try {
    ResultSet rs = statement.executeQuery("SELECT `message` FROM `notifications` WHERE `active`='1'");
    List<String> messages = new ArrayList<String>();
    int index = 1;
    if (rs.next()) {
        while (!rs.isLast()) {
        messages.add(rs.getString(index));
        index ++;
        } 
        if (rs.isLast()) {
        messages.add(rs.getString(index));
        }
    }
    return messages.toArray(new String[messages.size()]);
} catch (Exception localException) {
    if (localException instanceof NullPointerException) {
        /* ignore for now */
        localException.printStackTrace();
    } else {
        localException.printStackTrace();
    }
}

错误告诉我该列超出范围,但当我查看我的数据库时它不是。

java.sql.SQLException: Column Index out of range, 2 > 1.

有什么建议吗?提前致谢!

【问题讨论】:

    标签: java mysql jdbc range out


    【解决方案1】:

    里面

     if (rs.isLast()) {
        messages.add(rs.getString(index));
        }
    

    在此语句中,索引将为 2,但您的结果集仅包含一列。

    当您说rs.getString(2) 时,它将获取与第二列关联的值。

    应该是:

    ResultSet rs = statement.executeQuery("SELECT `message` FROM `notifications` WHERE `active`='1'");
    List<String> messages = new ArrayList<String>();
    int index = 1;
    while (rs.next()) {
        messages.add(rs.getString(index));
    }
    

    注意:最佳做法是根据列名而不是索引获取值。我相信您认为 getString(index) 访问了该行,并通过列名调用它会为您清除。

    ResultSet rs = statement.executeQuery("SELECT `message` FROM `notifications` WHERE `active`='1'");
    List<String> messages = new ArrayList<String>();
    String column = "message";
    while (rs.next()) {
        messages.add(rs.getString(column));
    }
    

    【讨论】:

    • 您先生,真是个天才。感谢您的课程,非常感谢!
    【解决方案2】:

    isLast 方法仅确定您是否位于最后一行,而不是最后一列。您使用index 的方式是遍历同一行上的所有列。

    确定列数的方法是从ResultSet获取ResultSetMetaData对象并从中获取列数,使用ResultSet上的getMetaData() methodgetColumnCount() method上的getColumnCount() method ResultSetMetaData。然后你可以用它来循环你的列。

    【讨论】:

      【解决方案3】:

      在您的查询中,SELECT 子句中只有一列 message。从您的 java 代码中删除 index++ 以消除异常,因为 rs.getString(index) 正在尝试获取查询结果中不存在的第 2 列的值。

      【讨论】:

        猜你喜欢
        • 2014-06-30
        • 2020-02-28
        • 2023-01-06
        • 1970-01-01
        • 2016-09-02
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 2022-01-13
        相关资源
        最近更新 更多