2017-10-29 7 views
1
private static final String QUERY = "SELECT * FROM " + TABLE_SONG_DETAILS + " WHERE " + TABLE_SONG_DETAILS + "." + "artist" + "=? ORDER BY track ?"; 
private PreparedStatement queryAllSongsInfo = conn.prepareStatement(QUERY); 

// the user inputs the artist_name and ORDER 
queryAllSongsInfo.setString(1, artist_name); 
if (order == ORDER_BY_DESC) { 
    queryAllSongsInfo.setString(2, "DESC"); 
} else { 
    queryAllSongsInfo.setString(2, "ASC"); 
} 

エラーを表示します。SQLエラーまたは欠落しているデータベース(近くに「?」:構文エラー)が

queryAllSongsInfo.setString(1, artist_name); 

なぜ私は複数のプレースホルダを使用しますか?なぜ2番目のプレースホルダはユーザーからの2番目の入力を考慮しないのですか?

答えて

1

あなただけの列の値のプレースホルダを使用することができます。テーブル名、カラム名、または(この例で試したように)予約語を使用することはできません。

private static final String QUERY_ASC = "SELECT * FROM "+TABLE_SONG_DETAILS +" WHERE "+TABLE_SONG_DETAILS+"."+"artist"+"=? ORDER BY track ASC"; 
private static final String QUERY_DESC = "SELECT * FROM "+TABLE_SONG_DETAILS +" WHERE "+TABLE_SONG_DETAILS+"."+"artist"+"=? ORDER BY track DESC"; 

private PreparedStatement queryAllSongsInfo = conn.prepareStatement(order==ORDER_BY_DESC?QUERY_DESC:QUERY_ASC); 

// the user inputs the artist_name and ORDER 
queryAllSongsInfo.setString(1, artist_name); 

次の2つのSQL文字列、昇順用と降順のために他を作成することができます

1

ありませんあなたが使用します。

queryAllSongsInfo.setString(2, "DESC"); 

これは、このORDER BY track 'DESC'のように2重引用符の間DESCASCキーワードを入れますと、これは正しくありません。

代わりに、例えばクエリと直接連結を使用します。

String QUERY = "SELECT * FROM "+TABLE_SONG_DETAILS +" WHERE "+TABLE_SONG_DETAILS+"."+"artist"+"=? ORDER BY track "; 
if(order==ORDER_BY_DESC) { 
    QUERY += "DESC"; 
}else { 
    QUERY += "ASC"; 
} 
PreparedStatement queryAllSongsInfo = conn.prepareStatement(QUERY); 
queryAllSongsInfo.setString(1, artist_name); 
関連する問題