1. ホーム
  2. Java

java.sql.SQLException: 結果セットの開始前

2022-02-09 23:02:53

このエラーは、JDBCを使用してデータベースに問い合わせを行った際に報告されました。

CREATE TABLE `d_user` (
  `id` int(10) NOT NULL,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
insert into d_user values(1,'sean');

public class Test {
	public static void main(String[] args){
		Connection conn = null;
		Statement stat = null;
		try{
			Class.forName("com.mysql.jdbc.Driver");
			String url = "jdbc:mysql://localhost:3306/mydb";
			String user = "root";
			String pwd = "196428";
			 
			conn = DriverManager.getConnection(url, user, pwd);
			stat = conn.createStatement();
			String sql = "select name from d_user where id = 1";
			ResultSet rs = stat.executeQuery(sql);
// if(rs.next()){
				String name = rs.getString(1);
				System.out.println(name);
// }
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(null ! = conn){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if(null ! = stat){
				try {
					stat.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

java.sql.SQLException: Before start of result set

java.sql.SQLException
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)

実行した結果は

sean

具体的なエラーメッセージは、使用するデータベースドライバーに関連するものです。 データベースドライバを mysql-connector-java-5.1.6-bin.jar に変更したところ(元々使用していたドライバは mysql-connector-java-5.1.10.jar )、エラーが報告されるようになりました。

......
Moves the cursor one line forward from the current position. resultSet The cursor is initially located before the first line; the first call to the next method makes the first line the current line; the second call makes the second line the current line, and so on. 
When the next method is called and returns false, the cursor is located after the last line.
......

テストコードのコメント部分を削除しても問題なく動作します。

sean

結果セットである ResultSet を操作する前に、必ず ResultSet.next() を使用して、結果セットの最初の行にポインタを移動してください。

next()メソッドのAPI解説をご覧ください。

......
Moves the cursor one line forward from the current position. resultSet The cursor is initially located before the first line; the first call to the next method makes the first line the current line; the second call makes the second line the current line, and so on. 
When the next method is called and returns false, the cursor is located after the last line.
......

JDBCは目を見張るほど簡単に書ける