SQL 错误或缺少数据库(“?”附近:语法错误)
Posted
技术标签:
【中文标题】SQL 错误或缺少数据库(“?”附近:语法错误)【英文标题】:SQL error or missing database (near “?”: syntax error) 【发布时间】:2018-04-10 15:11:59 【问题描述】: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);
为什么我不能使用多个占位符??为什么第二个占位符不考虑用户的第二个输入?
【问题讨论】:
【参考方案1】:您只能对列值使用占位符。您不能将它们用于表名、列名或(如您在此示例中尝试的)保留字。
您可以创建两个 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);
【讨论】:
【参考方案2】:使用时否:
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);
【讨论】:
以上是关于SQL 错误或缺少数据库(“?”附近:语法错误)的主要内容,如果未能解决你的问题,请参考以下文章
SQLITE_ERROR SQL错误或缺少数据库(“SCHEMA”附近:语法错误)
org.sqlite.SQLiteException:[SQLITE_ERROR] SQL 错误或缺少数据库(“as”附近:语法错误)
#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 ')' 附近使用的正确语法