2013-03-04 4 views
0

У меня возникли проблемы с синтаксическими ошибками SQL при использовании Java PreparedStatements.Проблемы с синтаксисом Java PreparedStatement

Три заявления я пытаюсь подготовить следующим образом:

insertBook = con.prepareStatement("INSERT INTO Books ? VALUES ?"); 
selectBooks = con.prepareStatement("SELECT * FROM Books?"); 
deleteBooks = con.prepareStatement("DELETE FROM Books?"); 

В первом выступлении я хотел бы передать в две строки, одна из которых содержит список столбцов для вставки в и другой, содержащий все значения для вставки. В двух других утверждениях я хотел бы добавить в конец (необязательное) предложение WHERE.

Я уже видел this вопрос, который, похоже, касается аналогичной проблемы, но в его случае оказалось, что он пытался использовать «s», где это не имело смысла; если я не сработал на SQL, я не вижу причин, по которым я не могу вставлять свои строки здесь. Я прочесываю Javadocs, но, похоже, не могу найти объяснения.

Большое спасибо!

+2

Вы не можете использовать 'prepareStatement()' таким образом. Почему бы вам не объединить строки, а затем передать результат в метод? –

ответ

1

Так оно и было спроектировано. ? -s осталось только для параметров. Подумайте, использовать StringBuilder, чтобы объединить свои предложения WHERE.

Это просто простой случай у не может использовать StringBuilder здесь, он эффективен для построения сложных запросов

Вот ваш пример

String whereClause = " WHERE Id = ?"; 

String insert = "INSERT INTO [Table](C1, C2) VALUES(?, ?)"; 
String select = "SELECT * FROM [Table] "; 
String update = "UPDATE [Table] SET C1 = ? "; 
String delete = "DELETE FROM [Table] "; 

PreparedStatement insertSt = con.prepareStatement(insert); 
PreparedStatement selectSt = con.prepareStatement(select + whereClause); 
PreparedStatement deleteSt = con.prepareStatement(update + whereClause); 
PreparedStatement updateSt = con.prepareStatement(delete + whereClause); 
+0

'StringBuilder' выглядит очень многообещающим. Разве просто невозможно использовать «PreparedStatement» в этой ситуации? Я относительно новичок в JavaDB. –

+0

@lan Knight StringBuilder предназначен только для конкатенации строк, вам все равно нужно использовать PreparedStatement для выполнения запросов –

0

Для вашего первого заявления:

insertBook = con.prepareStatement("INSERT INTO Books ? VALUES ?"); 

Начну со второго ?, после VALUES. Поскольку у вас есть только один ?, у вас есть только один placeholder и поэтому может передать только одно значение в оператор. Эта часть, одна, делает вашу цель недосягаемой для JDBC. На самом деле, prepareStatement() будет, по крайней мере, для некоторых драйверов и баз данных, отправить оператор на сервер базы данных, инструктируя его подготовить инструкцию. В это время сервер будет анализировать и планировать оператор, и поэтому в это время должны быть известны столбцы и количество параметров.

0

«?» в JDBC тесно связан с заменой параметров, поддерживаемой базовым протоколом СУБД. Тем не менее, вы пытаетесь изменить фактический SQL, который отправляется в БД, не заменяя параметры.

Смежные вопросы