|
![]() |
#1 |
Участник
|
оберните свои запросы в блок try/catch внутри T-SQL
X++: begin try begin tran; -- commit tran; end try begin catch rollback tran; throw; end catch
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: raz (5), Logger (3), gl00mie (2), Pandasama (1). |
![]() |
#2 |
Участник
|
Не помогло
Вот тестовый пример, аналогичный описываемой задаче: X++: public server static void testSQL() { Set permissionSet = new Set(Types::Class); Connection connection; Statement statement; str query; TestTable3798 testTable; //test table (SaveDataPerCompany = No) with one field str[10] named Field1 ; query += "BEGIN TRY \n"; query += "BEGIN TRANSACTION; \n"; query += "SELECT TOP 1 * FROM CustTable; \n"; query += "INSERT INTO TESTTABLE3798 (Field1, RecId) VALUES ('test', 123456); \n" ; query += "SELECT TOP 1 * FROM SYSTEMSEQUENCES WHERE NAME = -1; \n"; //query with error query += "COMMIT TRANSACTION; \n"; query += "END TRY \n"; query += "BEGIN CATCH \n"; query += "ROLLBACK TRANSACTION; \n"; query += "THROW; \n"; query += "END CATCH \n"; connection = new Connection(); statement = connection.createStatement(); permissionSet.add(new SqlStatementExecutePermission(query)); CodeAccessPermission::assertMultiple(permissionSet); statement.executeUpdate(query); CodeAccessPermission::revertAssert(); } Код: BEGIN TRY BEGIN TRANSACTION; SELECT TOP 1 * FROM CustTable; INSERT INTO TESTTABLE3798 (Field1, RecId) VALUES ('test', 123456); SELECT TOP 1 * FROM SYSTEMSEQUENCES WHERE NAME = -1; COMMIT TRANSACTION; END TRY BEGIN CATCH ROLLBACK TRANSACTION; THROW; END CATCH Цитата:
(1 row(s) affected)
(1 row(s) affected) (0 row(s) affected) Msg 245, Level 16, State 1, Line 5 Conversion failed when converting the nvarchar value 'Event' to data type int. |
|
![]() |
#3 |
Участник
|
Sorry, подниму здесь простой вопрос, чтобы не создавать новую тему.
Недавно обнаружил, что Statement.executeUpdate не возвращает ничего для простого update. Хотя в документации про return value сказано "An updated row count; otherwise, 0 (zero) for SQL statements that return nothing." X++: server static void test() { ResultSet rs; str sQuery; int qtyUpdated; ; // так, параметры вывода сообщений sQuery = "SELECT CASE WHEN (512 & @@OPTIONS) = 512 THEN 'ON' ELSE 'OFF' END AS a1"; new SQLStatementExecutePermission(sQuery).assert(); rs = new Connection().createStatement().executeQuery(sQuery); if (rs.next()) info(rs.getString(1)); CodeAccessPermission::revertAssert(); sQuery = "update [dbo].[TestTbl] set RecVersion = RecVersion+1;"; new SQLStatementExecutePermission(sQuery).assert(); // проверим, что никто не грохнул запись, пока мы мялись, как школьники у борделя qtyUpdated = new Connection().createStatement().executeUpdate(sQuery); info(int2str(qtyUpdated)); CodeAccessPermission::revertAssert(); } DAX2009 на ss2012r2, всё стоковое с последними хотфиксами и kb. Хотя в трёшке тот же эффект. Это норм или что-то где-то надо туда-сюда? |
|
![]() |
#4 |
Участник
|
Это норм. Документация в этой части не корректная.
То число, которое возвращает executeUpdate() - это признак успеха или ошибки 0 - выполнено успешно число - произошла ошибка Собственно, это же работа через ODBC, а драйвер ODBC просто не умеет возвращать количество обработанных строк. Вне зависимости от версии Axapta
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: dim-gin (1), Logger (3). |
Теги |
error, executeupdate, sql, statement, transact sql, transaction |
|
|