2016-12-02 22 views
0

さまざまなクエリ文字列を含むforループ内にプリペアドステートメントを配置すると、何らかの方法で破損しますか?PreparedStatementが正しいクエリで実行されていません

public static String deleteQuery(String[] title){ 
    String qry="DELETE FROM AnimeDatabase WHERE "; 
    for(int i=0;i < title.length;i++){ 
     if (i>0) qry += " OR "; 
     qry += "ANI_TITLE='" + title[i] + "'"; 
    } 
    return qry; 
} 

それはここから配列値を取得します:それはそれは私が作成したDELETEクエリの呼び出しに使用するいくつかの配列要素を取り

if(btn.equals("Continue")){ 
       String[] vals1 = request.getParameterValues("Vals"); 
       String count = ""; 
       queryStr = AniModel.deleteQuery(vals1); 
       PreparedStatement ps = conn.prepareStatement(queryStr); 
       int update = ps.executeUpdate(); 
       count = "" + update; 

        request.setAttribute("query",queryStr); 
        request.setAttribute("count",count); 
        RequestDispatcher dispatch = request.getRequestDispatcher("success4.jsp"); 
        dispatch.forward(request, response); 
      } 

私はこれを持っています:

<% 



       String[] values = request.getParameterValues("cbg"); 
       int countme=0; 
       int numb=1; 
       for(int i=0;i < values.length;i++){ 
        countme++; 
        numb=countme; 

       %> 
       <tr><td><input type="hidden" name="Vals" value="<%out.println(values[i]);%>"id="vs_<%=(numb)%>"><%=values[i]%></td></tr> 
       <% 
        } 
      %> 

最終的には正しいクエリ入力がありますが、更新を実行していないデータベース。

EDIT: 私はコマンドを実行するときにループが実行され、終了するまで配列内にいくつの値があるかに応じてステートメントが実行されます。

Continue codeブロックの内側にconn.setAutoCommit(false); と置き換えてください。conn.commit();を入力してください。 まだ動作しません。

+0

どこにコミットしていますか? – JonK

+0

接続上で 'setAutoCommit(true)'を呼び出していない限り、コードのどこかで 'conn.commit();'を呼び出してデータベースに変更を永続させる必要があります。あなたが 'conn.commit();'を呼んでおらず、自動コミットをオンにしていなければ、それが問題になるでしょう。 – JonK

+0

私はコミットをどこに置くべきかわかりません。また、コードを更新しました。それは単にクエリを実行しません。 – Xenos29

答えて

1

あなたが実際に達成したいものを知らないポイントのカップル:

  1. あなたが一度それを実行するための基準を網羅する単一のクエリを作成することはできませんレコードを削除するクエリを生成したい場合は?
  2. トランザクションコミットに問題が発生していますか?あなたは取引を始めていますか?
  3. クエリでパラメータを使用している場合は、SQL文字列と文をループ外に準備し、ループ内で実行前にパラメータを設定します。
  4. また、表示されているコードの周囲に他のクエリや問題がないことを確認してください。

あなたのロジックに間違いはありませんが、パターン(3)が私の経験からもう少し速くなっていますが、今すぐコードで直接的な問題を見ることはできません。

(ただし、カウントは文字列であるのが好きですが、名前の問題かもしれませんが、更新によって数値が返されるため、文字列に変換されますが、 varは本来、文字列形式で最後の行だけが格納されます)

オプション1(および編集内容)の場合。最適化の余地があります:

String[] vals1 = request.getParameterValues("Vals"); 
int count = 0; 
String sql = "DELETE FROM AnimeDatabase WHERE "; 

for(int i=0; i < vals1.length; i++) { 

    if (i>0) sql += " OR "; 
    sql += "ANI_TITLE='" + vals1 + "'"; 

} 

PreparedStatement ps = conn.prepareStatement(sql); 
int update = ps.executeUpdate(); 
count = update; 
+0

あなたのために私の投稿を編集します – Xenos29

+0

私の答えを更新しました – George

+0

それはキャストエラーを返します:整数は文字列にキャストできません。カウントを再びStringに戻してしまう問題を修正しました。しかし、依然としてクエリは実行されません。 – Xenos29

関連する問題