こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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週間がたってしまいました。ご教授お願いいたします。

投稿日時 - 2010-03-09 10:48:54

QNo.5737263

困ってます

質問者が選んだベストアンサー

パラメータtitleだけではなく、
パラメータisbnがちゃんと取れていますか?

where句で絞込みをしているので、isbnが間違っていると、
更新対象が0件になります。

投稿日時 - 2010-03-09 12:15:18

補足

ご指摘の通りifブロック内でh1タグ内にout.println(request.getPrameter("isbn")+iを書いて実行してみたところ、null値が返ってきていました。しかし、Display ie HTTP Headersというツールでクエリ情報を確認してみたところ、クエリは正常に送信されているようです。もしよろしければ考えられる原因などご回答くだされば幸いです。もちろん自分でもこれから原因を探って見たいと思います。ありがとうございました。何かヒントを得た気がします。

投稿日時 - 2010-03-09 16:31:10

お礼

回答ありがとうございます。早速これから確認してみます。

投稿日時 - 2010-03-09 16:06:55

ANo.1

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

参考URLにあるコードを使って、全パラメーターを表示してみてください。
名前が間違っていたりしませんか?
2バイト文字になっていたなんて事は、なかなか気づきにくい間違いだったりします。

参考URL:http://www.atmarkit.co.jp/fjava/rensai2/jspservlet05/jspsevlet05_2.html

投稿日時 - 2010-03-09 21:29:51

お礼

回答ありがとうございます。様々やっていたら知らぬ間に正常に動作するようになっていました。あまり気持ちのいい終わり方ではないですが、自分が何をやったかをノートにまとめてこの項は終わりたいと思います。ご紹介いただいたページもとても参考になる内容でしたので大切に保存させていただきました。
ほんとにありがとうございました。

投稿日時 - 2010-03-09 23:06:48

あなたにオススメの質問