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

解決済みの質問

Prepared Statementがおかしい

MySQLに対して検索する Prepared Statement について質問します。
現在、 Google App Engine(GAE) で動いていたJavaのアプリケーションを Amazon Web Service(AWS)
に移動すべく、ソースの見直しを行っています。
以下のソースを走らせると、GAEのローカルテスト環境では動くものの、AWSのローカルテスト環境では
エラーが出てしまいます。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
response.setContentType("charset=utf-8");
PrintWriter out = response.getWriter();

try{
/** データベースへの接続を保持するConnectionクラス */
DBAccess dba = new DBAccess();
Connection conn = dba.getConnection();

PreparedStatement pstmt = null;

int staffId = Integer.parseInt(request.getParameter("staffId"));
String staffName = request.getParameter("staffName");
String staffSort = request.getParameter("staffSort");

String sql = "UPDATE first_tbl_staff SET staffName=?, staffSort=? WHERE staffId=?";

pstmt = conn.prepareStatement(sql);

pstmt.setString(1, staffName);
pstmt.setString(2, staffSort);
pstmt.setInt(2, staffId);

System.out.println("sql================" + sql);

int count = pstmt.executeUpdate(sql);
※※※←ここで落ちる
if(count == 1){
String res = "[";
res += "{\"staffId\":\"" + staffId + "\"}";
res += "]";
out.println(res);
}
pstmt.close();
conn.close();
} catch(Exception e){
System.out.println("例外発生:" + e );
}finally{
}
}
}

コンソールを見ると、以下のプリントアウト文と例外を出しています。
sql================UPDATE first_tbl_staff SET staffName=?, staffSort=? WHERE staffId=?
例外発生:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?, staffSort=? WHERE staffId=?' at line 1

簡単なUPDATE文ですので、文法的にも間違いないと思いますが、何度やってもGAEでは動作しますが、AWSではエラーとなってしまいます。
それぞれの開発環境ですが、同一のマシン(Windows7 32bit)に2つのEcripseを載せています。

【GAE】
・Eclipse3.7
・Java 6
・Jetty?
・App Engine SDK
・MySQL5.5.27 
・jdbcドライバ:mysql-connector-java-5.1.26-bin.jar

【AWS】
・Eclipse4.3
・Java 7
・Tomcat 7
・AWS SDK
・MySQL5.5.27 
・jdbcドライバ:mysql-connector-java-5.1.26-bin.jar

MySQLはローカルの同一のDB/テーブルを見に行ってます。
UPDATE文でエラーが出ますが、INSERT文でも同様にGAEでは通るのですがAWSではエラーになります。
因みにPrepared Statementオブジェクトではなく Statementオブジェクトを利用すると問題なく動きました。

丸1日かかっていろいろ環境を変えたりしていますが、Prepared Stateオブジェクトを利用すると、SQLの中味が
捉えにくく解決できない状況です。

どなた、ヒントになるようなことがおわかりでしたら、ご指導下さい。
よろしくお願いします。

投稿日時 - 2013-12-14 10:43:36

QNo.8385720

困ってます

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

失礼しました。

>int count = pstmt.executeUpdate(sql);

int count = pstmt.executeUpdate();

でした。

投稿日時 - 2013-12-17 16:17:31

お礼

amino_plさん、教えて頂いた通り
int count = pstmt.executeUpdate();
でエラーが出なくなり、ちゃんとアップデートできるようになりました。

確かに、
pstmt = conn.prepareStatement(sql);
って sql を引数にセットしておいて、更に
int count = pstmt.executeUpdate(sql);
はクドイですよね。

でも変ですねぇ?
Google App Engine では
pstmt = conn.prepareStatement(sql)
で問題なく通ってしまいます。
今再度やってみたのですがやっぱり通ってしまいました。

これって、Google App Engine のSDKがユルクて、AWSのSDKが厳密と
いうことでしょうか?
それともJava6とJava7の違いでしょうか?

理由はよくわかりませんけど、結果オーライです。

amino_plさん、本当にありがとうございました。
大助かりです。感謝の気持ちで一杯です。

ありがとうございました。

投稿日時 - 2013-12-18 10:01:19

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

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

回答(3)

ANo.2

>pstmt = conn.prepareStatement(sql);

pstmt = conn.prepareStatement();

投稿日時 - 2013-12-17 15:53:29

ANo.1

こんにちは。

確実に同じソースを利用しているのであればよくわかりませんが

pstmt.setString(1, staffName);
pstmt.setString(2, staffSort);
pstmt.setInt(2, staffId);

最後のpstmt.setInt(2,staffId)は
pstmt.setInt(3,staffId);
ではないでしょうか?

質問する際の転記ミスだったらスミマセン。

投稿日時 - 2013-12-14 11:24:13

お礼

早速の回答ありがとうございました。
「staffSort」を削除してより単純なSQLにしたりいろいろやってみました。投稿するときそのときの変更が残ってしまったものと思われます。
実際のソースでは
pstmt.setInt(3,staffId);
となっています。
その意味では転記ミスです。
混乱させてゴメンナサイ

投稿日時 - 2013-12-14 13:04:55

あなたにオススメの質問