我对编程很新,我在使用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)
我已经尝试了所有常用选项,之前没有问过堆栈溢出问题可以解决这个问题。有谁知道接近这个的最佳方法?谢谢!
答案 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);
您可能感到困惑,因为您的查询返回了许多列。列和行不共享索引。
如果你曾经在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