SQL 错误或缺少数据库(靠近“?”:语法错误)

SQL error or missing database (near “?”: syntax error)

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);

为什么我不能使用多个占位符??为什么第二个占位符不考虑用户的第二个输入?

没有当你使用 :

queryAllSongsInfo.setString(2, "DESC");

这会将 DESCASC 关键字放在两个引号之间 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);

您只能对列值使用占位符。您不能将它们用于 table 名称、列名或(如您在此示例中尝试的那样)保留字。

您可以创建两个 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);