Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > jdbc+MySQL, не выполняется двойной select


Автор: denixx 15.7.2011, 16:23
Вот сейчас тренируюсь на MySQL'е: написал простенькое приложеньице, которое выполняет SQL-запрос, написанный в JTextArea и передаёт его мускулу на обработку. 

Так выяснилось, что в Workbench запись 
"select * from test.client; 
select * from test.client;" 
выполняется нормально, возвращает две одинаковых таблицы, а в моем приложении не хочет, ругается: 
"com.mysql.jdbc.exceptions.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 'select * from test.client' at line 2" 

Неужели мускул не умеет обрабатывать двойной запрос? 

Для выполнения запроса я использую execute()

Код

        Statement stmt = null;
        try {
            stmt = conn.createStatement();
        } catch (SQLException ex2) {
        }
        ResultSet rs = null;
        boolean resExec = false;
        int updCount = 0;
        try {
            if (wnd.jta1.getSelectedText()!=null) {
                System.out.println("\"" + wnd.jta1.getSelectedText() + "\"");
                //rs = stmt.executeQuery(wnd.jta1.getSelectedText());
                resExec = stmt.execute(wnd.jta1.getSelectedText());
            } else {
                System.out.println("\"" + wnd.jta1.getText() + "\"");
                //rs = stmt.executeQuery(wnd.jta1.getText());
                resExec = stmt.execute(wnd.jta1.getText());

            }
            System.out.println("resExec = " + resExec);
            if (resExec == true) {
                rs = stmt.getResultSet();
                System.out.println("resExec = true, взят rs");
            } else {
                updCount = stmt.getUpdateCount();
                System.out.println("resExec = false, взят updCount = " +
                                   updCount);
            }
        } catch (SQLException ex1) {
            ex1.printStackTrace();
        }


В принципе не выполняются любые 2 запроса подряд. 
Только один за раз. 

Пробовал ещё 
"insert into test.client (ClientName, Address1) 
values ('Anton','Antonov'); 
delete from test.client WHERE ClientName = 'Anton' and Address1 = 'Antonov'; 
select * from test.client;" 
тоже не хочет выполнять.

Автор: Zыыыыы 15.7.2011, 16:40
Дело тут все же не в MySQlе. Думаю это происходит из-за того, что метод execute воспринимает строку как один запрос - ессно он получается невалидным. Вариант решения - парсить текст со скриптом с учетом разделителя ";".

Автор: denixx 28.7.2011, 10:42
Выяснилось, что эта возможность отключена по умолчанию, и её надо включать при помощи специального параметра, записанного в URL соединения с БД:
Код

        conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/test?allowMultiQueries=true",
                "login", "password");

Тогда всё работает.
Но, как утверждают разработчики MySQL, это может быть опасно из-за возможности SQL-инъекций в коде.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)