Ошибка 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);
Другие вопросы по тегам