質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

6269閲覧

H2データベース使用中に発生する「JdbcSQLException: 有効なデータがありません」の原因について

ramune3

総合スコア11

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2017/08/14 06:14

###質問内容
現場未経験のプログラマです。
現在、「スッキリわかるサーブレット&JSP」という書籍を参考にしながら、
プログラムの作成に取り組んでいます。

H2データベースを使用した、
T_ANSWERというテーブルを参照するプログラムの実行時に下記のエラーが出てしまいます。

org.h2.jdbc.JdbcSQLException: 有効なデータがありません
No data is available [2000-196]

直接の原因、対処法がわからず、行き詰っています。
原因として考えられるものはなんでしょうか。
###試したこと
・エラー内容(org.h2.jdbc.JdbcSQLException: 有効なデータがありません)による検索
→該当のエラーに関するサイトが見つからない

・エラーコード(No data is available [2000-196])による検索
→同じく同様のエラーコードが見つからない

H2データベースのエラーコード一覧を見る
→プログラム内のSQLが正しくセットされていないということ?

・H2データベースのログアウト、シャットダウン
・PCの再起動
→変化せず
###T_ANSWERテーブルの内容

NOANSWER_SYMBOLANSWERANSWER_COUNT
1Aごはん0
1Bパン0
1Cシリアル0
1Dその他0

###コード内容
T_AnswerDAO.java

Java

1package dao; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8import java.util.ArrayList; 9import java.util.List; 10 11import model.Answer; 12import model.AnswerAll; 13 14public class T_AnswerDAO { 15 public List<AnswerAll> findAll(){ 16 Connection conn = null; 17 List<AnswerAll> empList = new ArrayList<AnswerAll>(); 18 try { 19 //JDBCドライバの読み込み 20 Class.forName("org.h2.Driver"); 21 22 //DB接続 23 conn = DriverManager.getConnection("jdbc:h2:file:C:/data/questionnaire","sa",""); 24 25 //SELECT文を準備 26 String sql = "SELECT NO,ANSWER_SYMBOL,ANSWER,ANSWER_COUNT+1 FROM T_ANSWER"; 27 PreparedStatement pStmt = conn.prepareStatement(sql); 28 29 //実行とテーブルの取得 30 ResultSet rs = pStmt.executeQuery(); 31 32 //レコードの内容をEmployeeインスタンスに設定し、ArrayListインスタンスに追加 33 while(rs.next()) { 34 int no = rs.getInt("NO"); 35 String answerSymbol = rs.getString("ANSWER_SYMBOL"); 36 String answer = rs.getString("ANSWER"); 37 int answerCount = rs.getInt("ANSWER_COUNT"); 38 AnswerAll answerAll = new AnswerAll(no,answerSymbol,answer,answerCount); 39 empList.add(answerAll); 40 } 41 } catch(SQLException e) { 42 e.printStackTrace(); 43 return null; 44 } catch(ClassNotFoundException e) { 45 e.printStackTrace(); 46 return null; 47 } finally { 48 //DB切断 49 if(conn != null) { 50 try { 51 conn.close(); 52 } catch(SQLException e) { 53 e.printStackTrace(); 54 return null; 55 } 56 } 57 } 58 return empList; 59 } 60 61 public AnswerAll findByAnswer(Answer ans) { 62 Connection conn = null; 63 AnswerAll answerAll = null; 64 try { 65 //JDBCドライバ 66 Class.forName("org.h2.Driver"); 67 //DB接続 68 conn = DriverManager.getConnection("jdbc:h2:file:C:/data/questionnaire","sa",""); 69 70 //SELECT文を準備 71 String sql = "SELECT NO,ANSWER_SYMBOL,ANSWER,ANSWER_COUNT+1 FROM T_ANSWER WHERE NO = ? AND " 72 + "ANSWER_SYMBOL = ? AND ANSWER = ?"; 73 PreparedStatement pStmt = conn.prepareStatement(sql); 74 pStmt.setInt(1,ans.getNo()); 75 pStmt.setString(2,ans.getAnswerSymbol()); 76 pStmt.setString(3, ans.getAnswer()); 77 78 //実行 79 ResultSet rs = pStmt.executeQuery(); 80 81 //一致したらAnswerAllインスタンスを生成 82 if(conn != null) { 83 //テーブルからデータ取得 84 int no = rs.getInt("NO"); 85 String answerSymbol = rs.getString("ANSWER_SYMBOL"); 86 String answer = rs.getString("ANSWER"); 87 int answerCount = rs.getInt("ANSWER_COUNT"); 88 89 answerAll = new AnswerAll(no,answerSymbol,answer,answerCount); 90 } 91 } catch(SQLException e) { 92 e.printStackTrace(); 93 return null; 94 } catch(ClassNotFoundException e) { 95 e.printStackTrace(); 96 return null; 97 } finally { 98 if(conn != null){ 99 try { 100 conn.close(); 101 } catch(SQLException e) { 102 e.printStackTrace(); 103 return null; 104 } 105 } 106 } 107 return answerAll; 108 } 109} 110

T_AnswerDAOTest.java

java

1package test; 2 3import dao.T_AnswerDAO; 4import model.Answer; 5import model.AnswerAll; 6 7public class T_AnswerDAOTest { 8 9 public static void main(String[] args) { 10 testFindByAnswer1(); //見つかる 11 testFindByAnswer2(); //見つからない 12 } 13 14 public static void testFindByAnswer1() { 15 Answer answer = new Answer(1,"A","ごはん"); 16 T_AnswerDAO dao = new T_AnswerDAO(); 17 AnswerAll result = dao.findByAnswer(answer); 18 19 if(result != null && 20 result.getNo() == 1 && 21 result.getAnswerSymbol().equals("A") && 22 result.getAnswer().equals("ごはん") && 23 result.getAnswerCount() == 0 ){ 24 System.out.println("testFindByAnswer1:成功しました"); 25 } else { 26 System.out.println("testFindByAnswer1:失敗しました"); 27 } 28 } 29 30 public static void testFindByAnswer2() { 31 Answer answer = new Answer(1,"B","ごはん"); 32 T_AnswerDAO dao = new T_AnswerDAO(); 33 AnswerAll result = dao.findByAnswer(answer); 34 35 if(result == null) { 36 System.out.println("testFindByAnswer2:成功しました"); 37 } else { 38 System.out.println("testFindByAnswer2:失敗しました"); 39 } 40 } 41} 42

Answer.java

java

1package model; 2 3public class Answer { 4 private int no; 5 private String answerSymbol; 6 private String answer; 7 8 public Answer(int no,String answerSymbol,String answer) { 9 this.no = no; 10 this.answerSymbol = answerSymbol; 11 this.answer = answer; 12 } 13 14 public int getNo() { return no; } 15 public void setNo(int no) { this.no = no; } 16 17 public String getAnswerSymbol() { return answerSymbol; } 18 public void setAnswerSymbol(String answerSymbol) { this.answerSymbol = answerSymbol; } 19 20 public String getAnswer() { return answer; } 21 public void setAnser(String anser) { this.answer = anser; } 22 23} 24

AnswerAll.java

java

1package model; 2 3public class AnswerAll { 4 private int no; 5 private String answerSymbol; 6 private String answer; 7 private int answerCount; 8 9 public AnswerAll(int no,String answerSymbol, String answer,int answerCount) { 10 this.no = no; 11 this.answerSymbol = answerSymbol; 12 this.answer = answer; 13 this.answerCount = answerCount; 14 } 15 16 public int getNo() { return no; } 17 public void setNo(int no) { this.no = no; } 18 19 public String getAnswerSymbol() { return answerSymbol; } 20 public void setAnswerSymbol(String answerSymbol) { this.answerSymbol = answerSymbol; } 21 22 public String getAnswer() { return answer; } 23 public void setAnswer(String answer) { this.answer = answer; } 24 25 public int getAnswerCount() { return answerCount; } 26 public void setAnswerCount(int answerCount) { this.answerCount = answerCount; } 27 28}

###エラー内容
AnswerDAOTest.javaの実行時にエラーが出ます。

org.h2.jdbc.JdbcSQLException: 有効なデータがありません
No data is available [2000-196]
testFindByAnswer1:失敗しました
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
at org.h2.message.DbException.get(DbException.java:179)
at org.h2.message.DbException.get(DbException.java:155)
at org.h2.message.DbException.get(DbException.java:144)
at org.h2.jdbc.JdbcResultSet.checkOnValidRow(JdbcResultSet.java:3224)
at org.h2.jdbc.JdbcResultSet.get(JdbcResultSet.java:3230)
at org.h2.jdbc.JdbcResultSet.get(JdbcResultSet.java:3247)
at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:350)
at dao.T_AnswerDAO.findByAnswer(T_AnswerDAO.java:84)
at test.T_AnswerDAOTest.testFindByAnswer1(T_AnswerDAOTest.java:17)
at test.T_AnswerDAOTest.main(T_AnswerDAOTest.java:10)
org.h2.jdbc.JdbcSQLException: 有効なデータがありません
No data is available [2000-196]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
at org.h2.message.DbException.get(DbException.java:179)
at org.h2.message.DbException.get(DbException.java:155)
at org.h2.message.DbException.get(DbException.java:144)
at org.h2.jdbc.JdbcResultSet.checkOnValidRow(JdbcResultSet.java:3224)
at org.h2.jdbc.JdbcResultSet.get(JdbcResultSet.java:3230)
at org.h2.jdbc.JdbcResultSet.get(JdbcResultSet.java:3247)
at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:350)
at dao.T_AnswerDAO.findByAnswer(T_AnswerDAO.java:84)
at test.T_AnswerDAOTest.testFindByAnswer2(T_AnswerDAOTest.java:33)
at test.T_AnswerDAOTest.main(T_AnswerDAOTest.java:11)
testFindByAnswer2:成功しました

以上、お力添えいただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決いたしました。
H2データベースの問題ではなく、作成したT_AnswerDAO.javaのプログラムに誤りがありました。

下記の部分が
//一致したらAnswerAllインスタンスを生成
** if(conn != null) {
** //テーブルからデータ取得
int no = rs.getInt("NO");
String answerSymbol = rs.getString("ANSWER_SYMBOL");
String answer = rs.getString("ANSWER");
int answerCount = rs.getInt("ANSWER_COUNT");

answerAll = new AnswerAll(no,answerSymbol,answer,answerCount); }

正しくは下記の通りでした。
//一致したらAnswerAllインスタンスを生成
** if(rs.next()) {
** //テーブルからデータ取得
int no = rs.getInt("NO");
String answerSymbol = rs.getString("ANSWER_SYMBOL");
String answer = rs.getString("ANSWER");
int answerCount = rs.getInt("ANSWER_COUNT");

answerAll = new AnswerAll(no,answerSymbol,answer,answerCount); }

ResultSetインタフェースのnextメソッドを利用して、1行ずつ問い合わせをかけることができていなかったので、有効なデータにアクセスすることができていなかったようです。
参考:http://www.atmarkit.co.jp/ait/articles/0107/11/news001.html

以上、ご迷惑おかけいたしました。

投稿2017/08/15 01:31

ramune3

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問