###質問内容
現場未経験のプログラマです。
現在、「スッキリわかるサーブレット&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テーブルの内容
NO | ANSWER_SYMBOL | ANSWER | ANSWER_COUNT |
---|---|---|---|
1 | A | ごはん | 0 |
1 | B | パン | 0 |
1 | C | シリアル | 0 |
1 | D | その他 | 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:成功しました
以上、お力添えいただければ幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。