2014-10-21 2 views
0

Я использую Java (JDBC) для создания утилиты командной строки для выполнения SQL-запроса. Сценарий определяется как текстовый файл, имеющий много запросов. Каждый запрос разделяется разделителем запросов (";"). Выходной сигнал направляется в стандартный вывод.Выполнение нескольких операторов SQL (CRUD) с помощью JDBC

SELECT * FROM table1; 
UPDATE table1 SET field1='' WHERE field2=''; 
SELECT * FROM table1; 
INSERT INTO table1 VALUES(...) 
SELECT * FROM table1; 

Поскольку JDBC может выполнять операторы дискретно, только если они не возвращают ResultSet, мне нужен другой подход.

На данный момент я прочитал файл сценария с запросами, разделил их на разделитель и проанализировал каждый запрос, будь то запрос «SELECT», или «INSERT», «UPDATE», «DELETE», запрос. После этого я буду выполнять каждый запрос в его собственном заявлении. Те, которые возвращают что-то, записываются в stdout, выполняются запросы, управляющие базой данных. И, конечно, я бы сохранил порядок запросов из файла.

Моя проблема: если один из запросов в файле неверен, я не могу откат, потому что каждый запрос выполняется отдельно. Как я могу справиться с этой проблемой?

+0

, если вы поделитесь своим кодом, чем мы сможем легко понять –

+0

Ищем подход к реализации этого. Я думаю, что этот код является тем, что я ищу: http://stackoverflow.com/a/1497614/1188357 – Kiril

+0

в конце инструкции выполняется строкой, делает отдельный метод для выполнения запроса и устанавливает флаг для действительного line –

ответ

1

Для подключения к базе данных просто вызовите connection.setAutoCommit (false), затем выполните ваши инструкции и вызовите connection.commit(), когда вы закончите, или connection.rollback(), если вы столкнулись с ошибкой.

+0

Подробнее см. в учебнике по Java [Транзакции] (http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html). –

+0

Основная проблема заключается в дифференциации запросов 'SELECT' и' UPDATE, DELETE, INSERT ... '. Этот ответ был рассмотрен, я думаю: http://stackoverflow.com/a/1497614/1188357 – Kiril

0

Это код для добавления запросов к пакету.

Statement stmt = conn.createStatement(); 
conn.setAutoCommit(false); 

String SQL = "INSERT INTO table1 VALUES(...)"; 
stmt.addBatch(SQL); 

String SQL = "INSERT INTO Employees (id, first, last, age) " + 
     "VALUES(201,'Raj', 'Kumar', 35)"; 
stmt.addBatch(SQL); 

String SQL = "UPDATE Employees SET age = 35 " + 
     "WHERE id = 100"; 
stmt.addBatch(SQL); 


int[] count = stmt.executeBatch(); 

// Явное совершать заявления, чтобы применить изменения

conn.commit(); 

Попробуйте .....

+0

Как насчет 'SELECT' запросов? – Kiril

+0

Строка SQL = ".... здесь мы можем хранить запросы ..........."; –

+0

Что я хотел сказать, если у меня есть 'String SQL =" SELECT * FROM emploeyees "', как я могу получить результат при добавлении этого запроса в пакет? – Kiril

0

Этот код может полезно для вас.

String Query1 = "SELECT * FROM Tablename1"; 
     stmt1 = con.createStatement(); 
     ResultSet rs = stmt1.executeQuery(Query1); 
     rs.next(); 
     int totalQuery1Count = rs.getInt("TOTAL_Item"); 

    String Query2 = "SELECT * FROM Tablename2"; 
     rs = stmt1.executeQuery(Query2); 
     rs.next(); 
     int totalQuery2Count = rs.getInt("TOTAL_Item2"); 
Смежные вопросы