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



我对编程相当陌生,我有一个问题,从使用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)

我已经尝试了所有通常的选项,没有问题以前问堆栈溢出可以回答这个问题。有人知道最好的方法吗?谢谢!

由于您获得的是最后一条记录作为最新会话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;
    

您的查询只返回一列session_id。要获取第一列,索引为1。

resultSet.getInt(1);
您可能感到困惑,因为您的查询返回了许多。列和行不共享索引。
  • 第一列将始终是索引1,无论你"指向"哪一行。
  • 行总是你当前"指向"的行。

如果您曾经在Java中使用过扫描器,您可能遇到过类似的"指向"语句。基本上,ResultSet"跟踪"你所在的行。您调用的任何方法都将在该行上执行,直到您最终将该行向前移动。

有关更多信息,我建议您阅读Javadoc的ResultSet。

对于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

您的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) { }
}

相关内容

  • 没有找到相关文章

最新更新