0

我正在尝试从我的 java 代码中获取列的最大数据,但结果集中出现错误

我的代码如下所示

Class.forName("com.mysql.jdbc.Driver");

con=DriverManager.getConnection("jdbc:mysql://localhost/testdb123","root","root");

LOGGER.info("connected to the database");
Statement stmt0 = conn.createStatement();           
String qr= "INSERT INTO stumarks " + "VALUES ("+null+","+marks+")";
Statement stmt1 = conn.createStatement();
stmt1.executeUpdate(qr);
String countQuery = "select MAX('seqNum') as count1 from stumarks";
ResultSet res = stmt0.executeQuery(countQuery);
LOGGER.info("result set success!!"); 
int num = res.getInt("count1");``
System.out.println(num);
4

4 回答 4

3

在尝试获取价值之前

int num = res.getInt("count1");

您需要调用ResultSet#next()(并检查它是否返回 true)来访问结果集的第一行

if (rs.next()) {
    // Do what you want
    int num = res.getInt("count1");
    System.out.println(num);
}

要继续迭代结果集,您可以使用while循环。

于 2013-09-27T07:53:40.477 回答
0

JavaResultSet是一个游标;它在逻辑上指向某个查询结果中的特定位置。来自 Javadocs:

ResultSet游标最初位于第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推。

您正在尝试从它仍然指向列表顶部(位置)ResultSet上方的时间读取。beforeFirst要前进游标,请调用res.next(),它返回一个布尔值,指示是否有更多行。如果要打印多行的结果,请使用while如下循环:

while(res.next()) {
    System.out.println(res.getInt("count1"));
}
于 2013-09-27T07:58:23.693 回答
0

Javadoc 中描述的结果集从索引 -1 开始。 .next()应该调用一次以获得第一个结果。

最初,光标位于第一行之前。

从安全的角度来看,您应该避免将变量附加到您的请求中,而是使用参数(SQL 注入问题)

也不要忘记closeconnectionstatement避免Out of memory和避免占用你所有的数据库连接插槽。即使不需要使用 JRE 类,您也可以关闭结果集(良好做法):

当生成它的 Statement 对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,ResultSet 对象将自动关闭。

于 2013-09-27T07:57:35.877 回答
0

你必须像这样使用:

"INSERT INTO stumarks VALUES("+null+", "+marks+")";

prepareStatement()使用方法插入、删除和更新的好习惯。

并使用结果集,如:

if(rs.next)
{
   int num = res.getInt("count1");
}
于 2013-09-27T08:02:41.520 回答