java - SQL 错误或丢失数据库( “?” : syntax error) 附近

标签 java jdbc sqlite prepared-statement placeholder

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

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

最佳答案

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

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

关于java - SQL 错误或丢失数据库( “?” : syntax error) 附近,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47001708/

相关文章:

android - 在 Android 中绘制图形

java - 如何在 jar 文件中使用 SQLite 数据库?

java - hibernate 错误 : executeQuery method cannot be used for update

java - getBinaryStream(index) 问题

java - 为什么 stringbuffer 是最终的?

java - JDBC 与 MySQL - SELECT ... IN

java - 首次登录时无法打开 Hibernate Session 进行事务处理

android - 如何将 SQLite 数据库从 Android 复制到 MySQL 数据库(复制/同步)

java - 无法运行程序 "..."error=2,没有这样的文件或目录 (java)

java - Spring @ControllerAdvice 不起作用