从SQL结果集查询中检索给定列索引的值

时间:2014-08-07 13:43:13

标签: java sql jdbc indexing resultset

我对编程很新,我在使用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)

我已经尝试了所有常用选项,之前没有问过堆栈溢出问题可以解决这个问题。有谁知道接近这个的最佳方法?谢谢!

4 个答案:

答案 0 :(得分:1)

由于您将最后一条记录作为最新的会话ID,我认为您的按条件排序应为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)从1开始获取columnIndex,其中第一个查询字段为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;
    

答案 1 :(得分:1)

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

resultSet.getInt(1);

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

  • 第一列将始终为索引1,无论您是哪一行"指向"。
  • 该行将始终是您所在的行"指向"目前。

如果你曾经在Java中使用过扫描仪,你可能会遇到类似的"指向"之前的措辞。基本上,ResultSet"跟踪"你在哪一排您调用的任何方法都会在该行上执行,直到您最终向前移动该行。

有关详细信息,建议您阅读Javadoc for ResultSet

答案 2 :(得分:0)

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

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

要从此查询session_id获取resultset,请使用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) { }
}

答案 3 :(得分:0)

使用此行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