【问题标题】:Retrieving the value of a given column index from a SQL Result Set query从 SQL 结果集查询中检索给定列索引的值
【发布时间】:2014-08-07 13:43:13
【问题描述】:

我对编程很陌生,并且在使用 jdbc 从 SQL 查询中获取特定值时遇到问题。我想从 'session_id' 列的最后一行获取值,我知道有 13 行(正在初始化 int 'position'),我希望 'resultSet.getInt(13)' 会得到值(它是一个 int)从列的最后一行开始。

  try {
        String sql = "SELECT session_id FROM log_table ORDER BY session_id DESC";
        stmt = conn.createStatement();
        ResultSet resultSet = stmt.executeQuery(sql);

        while (resultSet.next()) {
            if (resultSet.last()) {
                int position = resultSet.getRow();
                latestSessionID = resultSet.getInt(position);
            }
            System.out.println("Latest session_id : "+latestSessionID);
        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

但是代码返回以下异常

Connected to driver     // my own trace
Connected to database      // my own trace
  java.sql.SQLException: Column Index out of range, 13 > 1. 
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1094)
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:997)
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:983)
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:928)
  at com.mysql.jdbc.ResultSetImpl.checkColumnBounds(ResultSetImpl.java:826)
  at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2710)
  at org.Database.JDBC.checkDatabase(JDBC.java:113)
  at org.Database.JDBC.main(JDBC.java:166)

我已经尝试了所有常用的选项,之前关于堆栈溢出的任何问题都无法回答这个问题。有谁知道解决这个问题的最佳方法?谢谢!

【问题讨论】:

    标签: java sql jdbc indexing resultset


    【解决方案1】:

    由于您将最后一条记录作为最新的会话 id,我假设您的 order by 条件应该是 ORDER BY SESSION_ID ASC 而不是 ORDER BY SESSION_ID DESC 如下使用:

           String sql = "SELECT session_id FROM log_table ORDER BY session_id asc"; 
    
           int position = 0;    // Number of nth Position
    
            while (resultSet.next()) {
    
            if (resultSet.last()) 
            {
                position = resultSet.getRow();
                latestSessionID = resultSet.getInt(1);
                //
                latestSessionID = resultSet.getInt("SESSION_ID");
                System.out.println("Number of sessions = " + position + ", Session ID is : " + latestSessionID);
            }
    

    注意事项:

    • resultSet.getInt(ColumnIndex) 取 columnIndex 从 1 开始,其中查询的第一个字段为 1,第二个字段为 2,以此类推.....

    • 由于您只需要 1 条记录,您还可以将查询更改如下:

      -- For Oracle
      SELECT SESSION_ID FROM LOG_TABLE WHERE ROWNUM=1 ORDER BY SESSION_ID DESC;  
      
      -- For other DBs based on DB,
      SELECT TOP 1 SESSION_ID FROM LOG_TABLE ORDER BY SESSION_ID DESC;
      SELECT SESSION_ID FROM LOG_TABLE ORDER BY SESSION_ID DESC LIMIT 1;
      

    【讨论】:

    • 啊,我正在到达最后一列,然后尝试向下搜索第 13 列条目。愚蠢的错误!谢谢!
    【解决方案2】:

    您的查询仅返回一列 session_id。要获取第一列,请使用 1 进行索引。

    resultSet.getInt(1);
    

    您可能感到困惑,因为您的查询返回了许多。列和行不共享索引。

    • 无论您“指向”哪一行,第一列始终是索引 1。
    • 该行将始终是您当前“指向”的任何行。

    如果您曾经在 Java 中使用过 Scanner,那么您之前可能遇到过类似的“指向”措辞。基本上,ResultSet 会“跟踪”您所在的行。您调用的任何方法都在该行上执行,直到您最终将该行向前移动。

    更多信息,我建议你阅读Javadoc for ResultSet

    【讨论】:

      【解决方案3】:

      使用这一行latestSessionID = resultSet.getInt(position);,您正在尝试调用第 13 列,因为最后一行是 13。您需要做的是尝试获取第 1 列,因为您的查询:SELECT session_id FROM log_table ORDER BY session_id DESC 仅将一列带到聚会。

      您还可以查看此链接,该链接逐步解释了所有内容:http://tutorials.jenkov.com/jdbc/resultset.html

      【讨论】:

        【解决方案4】:

        您的resultset 将包含一列,即您的查询SELECT session_id FROM log_table ORDER BY session_id DESC 包含一列。

        由于您期望的列在查询中,因此可以通过列名或它所在的索引位置在resultset 中调用它。

        要从此查询的resultset 中获取您的session_id,请使用resultSet.getInt(1)resultSet.getInt("session_id")

        这是您修改后的代码,还请注意 finally 块。使用核心 JDBC 时,需要确保 JDBC 对象是关闭的,否则会有内存泄漏的风险。

         ResultSet resultSet = null;
         try {
            String sql = "SELECT session_id FROM log_table ORDER BY session_id DESC";
            stmt = conn.createStatement();
            resultSet = stmt.executeQuery(sql);
        
            while (resultSet.next()) {
                if (resultSet.last()) {
                    latestSessionID = resultSet.getInt("session_id");
                }
                System.out.println("Latest session_id : "+latestSessionID);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally{
            try {resultSet.close();} catch(Exception e) { } //Suppress Exception
            try {conn.close();} catch(Exception e) { }
            try {stmt.close();} catch(Exception e) { }
        }
        

        【讨论】:

        • 我现在明白了,菜鸟的错误,谢谢你的帮助!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 2012-02-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多