2017-01-19 17 views
0

私はすでにstackoverflowの、インターネットの他の部分を探索したが見つけるcouldntのJavaとSQLのprepareStatementエラー(範囲外のパラメータインデックス)

java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1). 

を投げる私のコードの一部を修正しようとしてきました解決策は、エラーを修正しました。

これは、クラスファイルの先頭である:

PreparedStatement stmt; 

そして、これが私の建設業者である:

public DataAccessObjectImpl() throws Exception { 
    this.conn = new DBConnector(); 
} 

これは、メソッドのthatsですが、問題を引き起こす:

@Override 
public boolean addAlbum(int UID, String artist, String album) { 
    String sql = ""; 

    try { 
     stmt = conn.getConnection().prepareStatement("INSERT INTO music (identifier, UID, artist, album) VALUES (?,?,?,?);"); 
     stmt.setString(1, getNewIdentifier()); 
     stmt.setInt(2, UID); 
     stmt.setString(3, artist); 
     stmt.setString(4, album); 
     stmt.executeUpdate(); 
    } catch (Exception ex) { 
     System.out.println("nugget 1 : " + ex); 
    } finally { 
     try { 
      if (stmt != null) { 
       stmt.close(); 
       return true; 
      } 
     } catch (Exception e) { 
      System.out.println("Nugget 2 : " + e); 
     } 
    } 
return false; 
} 

( 「ナゲット」という言葉は、ログ/コンソールで自分自身にとって簡単に見つけることができる)

私はstackoverflowに集めることができたから、おそらく私の疑問符はthats問題ですが、私はどのように把握することができないようです。同じクラスでうまく動作している他のメソッドに対しては、prepareStatementを使用しました。


私は以下のダウン提供されるいくつかの作業コードを持って、私はSQLインジェクションにパッチを適用するのprepareStatementでこのコードを置き換えたい:

try { 
     stmtb = conn.getConnection().createStatement(); 
      sql = "INSERT INTO music VALUES ('" + getNewIdentifier() + "','" + UID + "','" + artist + "','" + album + "')"; 
     } catch (SQLException ex) { 
     } 
     try { 
      stmt.executeUpdate(sql); 
      return true; 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
return false; 

は、高度にありがとうございます!

この行を変更することにより、固定

stmt = conn.getConnection().prepareStatement("INSERT INTO music (identifier, UID, artist, album) VALUES (?,?,?,?);"); 

と私はこれにそれを変更:

PreparedStatement stmt = conn.getConnection().prepareStatement("SELECT * FROM user WHERE username = (?);"); 

と、この行を削除:

PreparedStatement stmt; 

がためにあなたにKayamanありがとう手伝い!

+0

例外を表示するときに 'e.printStackTrace();'を使用します。例外の発生した行など、より多くの情報を取得できます。 – Kayaman

+0

あなたが実行していると思うクエリを実行していないと確信しています。 – Kayaman

+0

拡張検索のKayamanありがとうございました。私は "stmt.setInt(2、UID);"にある問題を発見しました。私はまだ問題を解決する解決策を見つけられませんでしたが。 – DavidCarl

答えて

0

クエリは正しいものの例外が発生するため、stmtが何らかの形で壊れている可能性があります。唯一の現実的な状況は、クエリを実行するために同じstmtを使用する複数のスレッドを持つマルチスレッド環境にあります。

新しいPreparedStatementオブジェクトを作成するのにprepareStatement()を使用しているため、「グローバル」参照を共有する理由はありません。ほとんどの場合、できるだけ小さな範囲で変数を定義して使用することがベストプラクティスです。

したがって、外側のスコープからstmt変数を削除し、代わりにあなたがする必要がある、これまで

PreparedStatement stmt = conn.getConnection().prepareStatement(query); 

を書きます。

0

それは''

sql = "INSERT INTO music VALUES ('" + getNewIdentifier() + "','" + UID + "','" + artist + "','" + album + "')"; 

に囲まれているので作品のクエリでは、UIDは、VARCHARのようにしてください渡され、再検査のデータベーススキーマとUIDがINTEGERであることを確認してください。また、あなたは、単純なStatement動作を再現する

stmt.setString(2, Integer.toString(UID)); 

stmt.setInt(2, UID); 

を交換しようとするかもしれません。

+0

UIDは "UID' int(255)NOT NULL"です。 "UID"整数(255)NOT NULLに変更しようとしましたが、残念ながらまだ動作しません。私はまた、intを確認するために、私のコードトラフを再度チェックしました。 – DavidCarl

関連する問題