2014-01-25 4 views
0

Я хочу выбрать несколько строк из моей базы данных на основе значений, хранящихся в моих переменных (массив supp_rec). Я использовал советы по аналогичному предыдущему сообщению/вопросу. Однако у меня все еще есть сообщения об ошибках. Фрагмент кода ниже:Использование переменных в where в выражении предложения SQL в JAVA

waiting_time = dbMngr.runQuery("SELECT " + "ExpectedWaitingTime" + " FROM Student" +  "where deptID = '" + supp_rec[1] + "' and weight = '" + supp_rec[2] + "'"); 
prob = PoisonModel(Phase3GUI.existence_time -  Long.parseLong(waiting_time[0]),2,Phase3GUI.existence_time); 
if (prob > 0.5) 
{ 
    dbMngr.execUpdate("DELETE " + " FROM Student" + "where deptID NOT IN" + supp_rec[1] + " and weight NOT IN" + supp_rec[2]); 
}+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

сообщения об ошибке ниже:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'deptID NOT IN1 and weight NOT IN8' at line 1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= '1' and weight = '8'' at line 1 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 

Пожалуйста, я буду признателен за любую помощь в том, чтобы решить эти ошибки. Спасибо.

+1

Использование заполнителей. Обновите код до этого * первым *, а затем повторите запрос. В любом случае, если вы посмотрите на фактический текст SQL *, вы сразу увидите несколько синтаксических проблем. – user2864740

+0

Это очень грязный способ делать что-то. Вместо «SELECT» + переменная «остальная инструкция»; попробуйте String.format («SELECT% s rest of statement;», variable); – 735Tesla

+0

@ 735Tesla Но использование 'String.format' для произвольных значений - это [плохой способ] (http://bobby-tables.com/) для обработки общей задачи здесь. – user2864740

ответ

1

Сообщение MySQL ошибка

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: У вас есть ошибка в вашем SQL синтаксиса; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом с «deptID НЕ IN1 и вес НЕ IN8» в строке 1 в sun.reflect.NativeConstructorAccessorImpl.newInstance0 (Native Method)

Итак, без пробела mysql пытается разобрать IN1 как часть его синтаксиса &, следовательно запрос выходит из строя. Он должен быть IN 1 где В действителен SQL-токен.

Чтобы это исправить, добавьте пробел после В в своем заявлении -

dbMngr.execUpdate("DELETE " + " FROM Student" + "where deptID NOT IN " + supp_rec[1] + " and weight NOT IN " + supp_rec[2]); 

EDIT: Замечено, что вы передаете одно значение для NOT IN. В этом случае это должно быть только ! = оператор.

dbMngr.execUpdate("DELETE " + " FROM Student" + "where deptID != " + supp_rec[1] + " and weight != " + supp_rec[2]); 
+0

Есть еще ошибки. (По крайней мере, одно отсутствующее пространство, и я подозреваю, что 'supp_rec [x]' недействительны как операторы IN - в частности, потому что я подозреваю, что они не имеют скобок, но я не совсем уверен, что они должны содержать.) – user2864740

1

Добавлено () между переменными контента, промежутки между ними и отформатированных немного

dbMngr.execUpdate(String.format("DELETE FROM Student WHERE deptID NOT IN (%s) and weight NOT IN (%s)", supp_rec[1], supp_rec[2])); 

Кроме, Это очень рискованно для Вас, не используя защиту от SQL Injections

0

Вы должен действительно использовать PreparedStatement. SQL будет намного легче читать, и вы избежите большинства этих проблем.

+0

Спасибо всем за ваши комментарии. Ошибка теперь решена. – user3048253

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