Ошибка SQL или отсутствует база данных (рядом с "?": Синтаксическая ошибка)
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 или отсутствующая база данных (near “?”: syntax error)
Если я включу только первый заполнитель, то он работает нормально.
queryAllSongsInfo.setString(1, artist_name);
Почему я не могу использовать несколько заполнителей?? Почему второй заполнитель не учитывает второй ввод от пользователя?
2 ответа
Решение
Вы можете использовать заполнители только для значений столбцов. Вы не можете использовать их для имен таблиц, столбцов или (как вы попробовали в этом примере) зарезервированных слов.
Вы можете создать две строки SQL, одну для возрастания, а другую для убывания:
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);
Нет, когда вы используете:
queryAllSongsInfo.setString(2, "DESC");
Это положит DESC
или же ASC
ключевые слова между двумя кавычками, как это ORDER BY track 'DESC'
и это не правильно.
Вместо этого используйте конкатенацию непосредственно с запросом, например:
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);