Выполнение нескольких запросов, символы, найденные после конца инструкции sql

Я пытаюсь выполнить два запроса, как указано ниже, но это дает мне символы, найденные после окончания исключения оператора sql. Я намерен добавить некоторые данные в таблицу2 из таблицы1 и некоторые данные пользователя. Используемая база данных — это база данных ms access.

try{
     String ad=  ((JTextField)jDateChooser1.getDateEditor().getUiComponent()).getText();
     String dd= ((JTextField)jDateChooser2.getDateEditor().getUiComponent()).getText();
     String rt= jTextField8.getText();
     int rn= Integer.parseInt(jTextField2.getText());
     int rr= Integer.parseInt(jTextField3.getText());
     String sr= jTextField7.getText();
     int nn= Integer.parseInt(jTextField4.getText());
     int na= Integer.parseInt(jTextField5.getText());
     int nc= Integer.parseInt(jTextField6.getText());
     int gc= Integer.parseInt(jTextField1.getText());

     stmt= conn.createStatement();
     String squery="insert into Room(GuestCode, Title, FirstName, LastName, Country, State, City, ContactNo) select GuestCode, Title, FirstName, LastName, Country, State, City, ContactNo from GuestDetails where GuestCode=gc;insert into Room(ArrivalDate, DepartureDate, RoomType, RoomNo, RoomRate, SpecialRequirements, NoOfNights, NoOfAdults, NoOfChildren) values(' "+ad+" ',' "+dd+" ',' "+rt+" ',' "+rn+" ',' "+rr+" ',' "+sr+" ',' "+nn+" ',' "+na+" ',' "+nc+" ');";

     rs=stmt.executeQuery(squery);
 }catch(Exception ex){
     JOptionPane.showMessageDialog(null, ex);
 }

person pallavi    schedule 21.10.2014    source источник
comment
Используйте PreparedStatement (в дополнение к совету Йориса).   -  person Kayaman    schedule 21.10.2014
comment
Будьте ответственным программистом. Избегайте SQL-инъекций при написании кода.   -  person Suresh Atta    schedule 21.10.2014


Ответы (1)


Вам не разрешено помещать более одного оператора в stmt.executeQuery, поэтому все после ; (и вы также можете оставить ;) должен быть помещен в отдельный запрос и выполняться отдельно.

Однако, прочитав описание вашей проблемы еще раз (и приступив к редактированию, чтобы добавить подготовленные операторы), я понял, что вы пытаетесь получить некоторые данные из 1 источника, а остальные - из переменных в вашей области.

Вы можете использовать только 1 вставку для вставки данных. если вы используете несколько, они будут иметь несколько строк. Если вы настаиваете на использовании двух операторов, один должен быть вставкой, другой — обновлением. (все еще запускайте 2 отдельных executeQuery для их запуска.)

Если вы хотите сделать это в 1 операторе, вам придется написать свой запрос таким образом, чтобы он работал именно так.

тогда это выглядит как дубликат: Использование INSERT INTO с 'SELECT' для предоставления одних значений, но не других (Access 2010)

наконец: попробуйте использовать подготовленные операторы, чтобы избежать инъекции sql (и сделать гораздо более аккуратный код)

PreparedStatement statement = conn.prepareStatement("select abc from xyz where x = ?");
statement.setString(1, "value you want to match x with";
statement.executeQuery();

// this will replace the value of the first ? with "value you want to match x with"
person Joeblade    schedule 21.10.2014
comment
пожалуйста, отредактируйте свой ответ, чтобы рекомендовать использовать PreparedStatement, чтобы избежать атак SQL Injection. - person Jim Garrison; 21.10.2014
comment
Я тоже пытался использовать подготовленный оператор, но получил то же исключение. Также я новичок в java и sql, так что не могли бы вы уточнить - person pallavi; 21.10.2014
comment
Да, хороший момент, я просто сосредоточился на его непосредственной проблеме, но это тоже довольно важно. - person Joeblade; 21.10.2014
comment
@pallavi, сначала разделите его на 2 оператора (таким образом, String query1 = ... и String query 2 = ... ) и выполните их отдельно. затем также используйте подготовленные операторы, так как это лучший и безопасный способ запуска sql. Я обновлю свой ответ примером - person Joeblade; 21.10.2014