如何解决错误“java.sql.SQLException:结果集开始之前” [重复]

Posted

技术标签:

【中文标题】如何解决错误“java.sql.SQLException:结果集开始之前” [重复]【英文标题】:How to solve error "java.sql.SQLException: Before start of result set" [duplicate] 【发布时间】:2021-06-29 10:07:19 【问题描述】:

我正在运行以下代码:

import java.sql.*;
public class App 
    public static void main(String[] args) throws Exception 
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/java", "root", "");
        System.out.println("connection established");
        String select_all = "select*from prac1";
        Statement ob = con.createStatement();
        ResultSet ob2 = ob.executeQuery(select_all);
        System.out.println(ob2.getString(1) + " " + ob2.getString(2) + " " + ob2.getString(3));
    

这在控制台中给了我:

connection established

Exception in thread "main" java.sql.SQLException: Before start of result set
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
        at com.mysql.cj.jdbc.result.ResultSetImpl.checkRowPos(ResultSetImpl.java:517)
        at com.mysql.cj.jdbc.result.ResultSetImpl.getString(ResultSetImpl.java:870)
        at App.main(App.java:11)

我才刚刚开始做这个,所以可能有一件愚蠢的事情我一定做了而没有看到,所以我提前道歉。

【问题讨论】:

【参考方案1】:

你可以这样做。

    public static void main(String[] args) throws ClassNotFoundException, SQLException 

    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/java", "root", "root");
    System.out.println("connection established");
    String select_all = "select*from xyz where name = 'aa'";
    Statement ob = con.createStatement();
    ResultSet ob2 = ob.executeQuery(select_all);
    ob2.next();
    System.out.println(ob2.getString(1) + " " + ob2.getString(2) + " " + ob2.getString(3));


说明: 结果集维护一个始终指向第一行之前的游标,因此在这种情况下,它没有指向特定行,因此我们使用“ob2.next()”移动游标以获取结果; 但它仍然只会给出一行的结果。但是,如果您想要该表中的所有记录,您可以这样写:

    public static void main(String[] args) throws ClassNotFoundException, SQLException 

    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/java", "root", "root");
    System.out.println("connection established");
    String select_all = "select*from xyz where name = 'aa'";
    Statement ob = con.createStatement();
    ResultSet ob2 = ob.executeQuery(select_all);
    while(ob2.next()) 
        System.out.println(ob2.getString(1) + " " + ob2.getString(2) + " " + ob2.getString(3));
    


“next()”方法的返回类型是布尔值,所以如果有下一行则返回true,然后将光标移动到下一个位置。 所以现在在这个 while 循环中 ob2.next() 移动光标并获得第一行的值,然后在第一次迭代后光标位于第二行位置之前,依此类推,直到剩下任何行。一旦行完成,“next()”返回 false 并中断循环。

【讨论】:

【参考方案2】:

ResultSet 视为一组有门的房间,每次进入房间时,您都可以从该房间获取数据。 将房间视为数据行。当您第一次使用executeQuery(..) 获得ResultSet 时,您站在所有房间的外面,并且就在第一个房间的门前,您必须进入以检索数据。你不能只说rs.getString(..)。你如何进入并穿过房间/行?

通过使用resutSet.next()。 所以在开始获取数据之前,先执行这个函数“进入房间”。

它经常用在while循环中:

while(rs.next())

   ...

【讨论】:

以上是关于如何解决错误“java.sql.SQLException:结果集开始之前” [重复]的主要内容,如果未能解决你的问题,请参考以下文章

sql关联查询使用别名报错

为啥我会收到 ORA-06531:对未初始化集合的引用?

问题Cause: java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK

SpringBoot+Mybatis+Druid批量更新 multi-statement not allow异常

如何解决颤振中的 build.gradle 错误。如何解决此错误“评估项目 ':app' 时出现问题。> 格式错误的 \uxxxx 编码。”

c#Ajax 的错误,应该如何解决?