如何解决错误“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:结果集开始之前” [重复]的主要内容,如果未能解决你的问题,请参考以下文章
问题Cause: java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
SpringBoot+Mybatis+Druid批量更新 multi-statement not allow异常
如何解决颤振中的 build.gradle 错误。如何解决此错误“评估项目 ':app' 时出现问题。> 格式错误的 \uxxxx 编码。”