JAVA JSPにてSQL UPDATE文が実行されない
翔泳社「10日でおぼえるJSP/サーブレット」をもとにJSP/サーブレットを学習中です。この書籍の6-3データベースのデータの更新、削除の項で、サンプルが上手く動作しないので、みなさんにご教授願いたく投稿させていただきました。長文になりますがよろしくお願いいたします。
内容はまず、以下のフォームにデータベースからデータを取得し、更新、削除行うというものです。
「ファイル名p_update1.jsp」
<form method="POST" action="p_update2.jsp">
<input type="submit" value="更新/削除" />
<input type="reset" value="取消" />
<table border="0">
<tr style="background:#00ccff">
<th>削除</th><th>ISBNコード</th><th>書名</th>
<th>価格</th><th>出版社</th><th>刊行日</th>
</tr>
<% while(rs.next()){ %>
<tr style="background:#ffffcc">
<td><input type="checkbox" name="delete<%=count %>" value="1" /></td>
<td><%=rs.getString("isbn") %>
<input type="hidden" name="isbn<%=count %>"
value="<%=rs.getString("isbn")%>" /></td>
<td>
<input type="text" name="title<%=count %>" size="25"
value="<%=rs.getString("title")%>" /></td>
<td>
<input type="text" name="price<%=count %>" size="5"
value="<%=rs.getString("price")%>" />円</td>
<td>
<select name="publish<%=count %>">
<% for(String pub : pubs){
<option value="<%=pub %>"
<%
if(pub.equals(rs.getString("publish"))){
out.print("selected='seleced'");
} %>><%=pub %></option>
<% } %>
</select></td>
<td>
<input type="text" name="published<%=count %>" size="12"
value="<%=dformat.format(rs.getDate("published")) %>" /></td>
</tr>
<%
count++;
}
rs.close();
ps.close();
db.close();
%>
</table>
<input type="hidden" name="count" value="<%=count %>" />
</form>
%>
このファイルは正しく動作し、データベースからデータが取得できます。削除したいレコードにチェックを入れてボタンを押すとデータが削除され正しく動作しますが、タイトルや価格を変更してもレコードの更新がおこなわれません。
受け取り側のファイルの内容です。
「ファイル名p_update2.jsp」
<%
request.setCharacterEncoding("Windows-31J");
InitialContext context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/Jsp10");
Connection db = ds.getConnection();
db.setAutoCommit(false);
PreparedStatement up = db.prepareStatement("UPDATE book SET title=?, price=?, publish=?, published=? WHERE isbn=?");
PreparedStatement del = db.prepareStatement("DELETE FROM book WHERE isbn=?");
int count = Integer.parseInt(request.getParameter("count"));
for(int i=1;i<count;i++){
if(request.getParameter("delete" + i)==null){
up.setString(1, request.getParameter("title" + i));
up.setString(2, request.getParameter("price" + i));
up.setString(3, request.getParameter("publish" + i));
up.setString(4, request.getParameter("published" + i));
up.setString(5, request.getParameter("isbn" + i));
up.executeUpdate();
}else{
del.setString(1, request.getParameter("isbn" + i));
del.executeUpdate();
}
}
up.close();
del.close();
db.commit();
db.close();
response.sendRedirect("p_update1.jsp");
%>
試しにifブロック内でout.println(request.getParameter("title")+i)をh1タグ内に記述して実行すると、タイトル名がきちんと表示されるので、とりあえずifブロック内に処理が移っていて、フォームから送信された情報は取得できているようです。
次にフォームから送信された情報ではなく、以下を実行してみると、きちんとデータベースが更新されます。
up.setString(1, "PHPライブラリコレクション");
up.setString(2, "2500");
up.setString(3, "翔泳社");
up.setString(4, "2000-04-04");
up.setString(5, "978-4-7980-1616-0");
up.executeUpdate();
各ソフトウェアのバージョン等
apache tomcat 6.0
jdbcドライバ mysql-connector-java-5.1.10-bin.jar
MYSQL 5.0.87
java JDK 1.6.0_13
eclipse 3.5
です。
何が問題か未だ解決できず、1週間がたってしまいました。ご教授お願いいたします。
お礼
本件ではあまり一般的でない呼称に惑わされておりました。電力会社のページを教えていただいたいて「光ファイバセンサ」という通称がわかり、おかげさまでとても調べやすくなりました。本当にどうもありがとうございました。
補足
なるほど光ファイバ電流センサでしたか。どうもありがとうございます。 電力会社がどのようなレーザーを使用しているかまでわかるとなお助かるのですが、もしなにかヒントをお持ちでしたらご教示ください。