Показать сообщение отдельно
Старый 08.08.2016, 06:43   #1  
Pandasama is offline
Pandasama
Участник
 
449 / 133 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Statement, запрос (несколько) с транзакцией
Товарищи, имею нижеописанную проблему.

Есть sql-запрос, который я вызываю из Ax обычным способом (Connection, Statement)
Запрос состоит из трех частей, завернутых в одну транзакцию (транзакцию внутри запроса, через SQL-операторы BEGIN TRANSACTION, COMMIT TRANSACTION) - 1я часть это некоторый SELECT, потом некоторый INSERT, и третья - некоторый UPDATE.

Если я выполняю запрос из Management Studio, я получаю в ответ сообщения вроде
Цитата:
1 row affected;
2000 row affected;
3 row affected;
Или если в последней части запроса была какая-либо ошибка, то:
Цитата:
1 row affected;
2000 row affected;
ошибка такая-то
После чего транзакция, конечно, откатывается.

Однако, когда я вызываю запрос из Ax с помощью
Statement.executeUpdate(query)
то в случае наличия ошибки в третьей (или во второй) части запроса - я об этом никак не узнаю. executeUpdate возвращает 0, getLastError, getLastErrorText - возвращают 0, будто бы операция успешно выполнена (т.к. успешно выполнился первый запрос в транзакции).

Можно ли как-то в такой ситуации получить из Statement корректный отчет о выполнении запроса или добиться, чтобы он кидал ошибку в такой ситуации?

Рабочим сейчас является следующий вариант:
X++:
Connection.ttsbegin()
Statement.executeUpdate(query1);
Statement.executeUpdate(query2);
Statement.executeUpdate(query3);
Connection.ttsCommit()
Из запроса убраны операторы "BEGIN TRANSACTION", "COMMIT TRANSACTION"
Текст запроса разбит на 3 части, каждая из который вызывается отдельно внутри транзакции, организованной классом Connection. Если в одной из частей запроса происходит ошибка, то ttsCommit не вызывается - и все три запроса откатываются.

Но у этого подхода есть один крупный недостаток: т.к. запросы выполняются отдельно, то, например, в третьем запросе я не вижу переменных, которые я DECLARE в первой части.