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


Автор: akula84 10.11.2004, 18:48
Вопрос возник такой.
Допустим я хочу при помощи JDBC послать к БД запрос.
Запрос состоит из нескольких строк(то есть вроде надо использовать addBatch()).
Но результатом запрос является некоторая выборка из нескольких таблиц(то есть нужен ResultSet)
Можно как-нибудь связать эти две вещи?

Заранее спасибо за помощь.
Если что не понятно, объясню

Автор: Domestic Cat 10.11.2004, 19:15
Не совсем понял smile
Добавляшь квери чeрез addBatch, делаешь execute, а затем получаешь ResultSet : ResultSet result = statement.getResultSet();

Автор: akula84 10.11.2004, 19:34
Результатом Batch() не может быть ResultSet...
А есть вариант как это можно обойти?

Автор: Domestic Cat 10.11.2004, 19:53
Но если не может, то откуда ты хочешь взять ResultSet? Да и методa Batch() нету.

Автор: akula84 10.11.2004, 19:56
А какое ест вообще решение такой задачи:
Есть у нас файлик,содержащий запрос к sql серверу. Запрос состоит из нескольких последовательных операций, в результате чего получаем некий набор необходимых нам строк.
Как лучше всего получить эти строки.
Не будем же мы каждую строчку отдельно выполнять? или другого выхода нет?

Надеюсь удалось объяснить проблемку smile

Автор: Domestic Cat 10.11.2004, 20:10
Вообще-то в апи у каждого batch-метода подписано:

Цитата
NOTE: This method is optional



Кромe того, чем тебe нe подходит statement.getResultSet() после выполнения statement.executeBatch() ?

Автор: akula84 11.11.2004, 10:41
Ошибку выдает следующую

java.sql.BatchUpdateException: [TDS Driver]Invalid Batch SQL Expression. A ResultSet was produced.

Автор: Zandr 11.11.2004, 13:09
Цитата
Я написал программку, которая должна печатать букву "ф", но она выдает ошибку "ArrayIndexOfBounds"... smile Блин, помогите, где у меня ошибка???


Я это к тому, что ты бы хоть привел список запросов, добавляемых в задание. А еще попробуй перед добалением запроса выводить его на консоль. И смотри какой запрос будет упрямиться.

Код

while (есть еще запросы) {
   прочитать запрос из файла (или откуда-то там)
   System.out.println( мой следующий запрос);
   Добавить в батч (мой запрос)
}


Есть мнение, что если ты добавляешь запросы в очередь - то вывод (ризалт сет) должен давать только последний.

Автор: Guest 11.11.2004, 13:32
Вот код , выдаваемая ошибка написана выше
Код

   try{
     new com.inet.tds.TdsDriver();
     String ip = "xxx.xx.x.xx";
     String login = "xxxxxx";
     String password = "xxxxxx";
     String url = "jdbc:inetdae:" + ip + ":1433?sql7=true&charset=Cp1251";
     connection = DriverManager.getConnection(url, login, password);
     String dbname = "xxxxxx";
     connection.setCatalog(dbname);
     Statement st = connection.createStatement();
     //Запрос будет другой
     st.addBatch("set forceplan on");
     st.addBatch("select * from init_as");
     st.executeBatch();
     ResultSet rs = st.getResultSet();
     while (rs.next()) {
       for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
         System.out.println(rs.getObject(i));
       }
     }
     connection.close();
   }catch(Exception ex){System.out.println("mistake");ex.printStackTrace();}


Автор: igon 12.11.2004, 02:40
Из документации:

executeBatch
public int[] executeBatch()
throws SQLException
...
Throws BatchUpdateException ... if one of the commands sent to the database ... attempts to return a result set.

т.е. в butch не должно быть команд, возвращающих ResultSet, в данном случае - типа SELECT, что, собственно, уже прозвучало

Цитата
Результатом Batch() не может быть ResultSet...
А есть вариант как это можно обойти?


Так что не SELECT команды из файлика можно объединить в butch и выполнить, а потом выполнить ПО ОДНОЙ команды типа SELECT - все равно, насколько мне известно, нет метода, возвращающего массив ResultSet[]

Обходной путь:
Заставить БД выполнить хранимую процедуру (анонимный блок?), которой передать все команды типа SELECT. Хранимая должна записать результаты выполнения в промежуточную таблицу, которую и запросить потом на предмет получения некого набора необходимых нам строк, возможно, с последующим их парсингом.

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