Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Maksim I.
0 / 0 / 1
Регистрация: 24.07.2012
Сообщений: 38
1

TRY CATCH

24.07.2014, 10:46. Просмотров 1762. Ответов 7
Метки нет (Все метки)

Всем привет, кратко опишу суть:
Есть база, все значения показателей хранятся в строковом формате, раньше в системе контроля ввода не было, поэтому в базе хранится черчете че.(Переделывать структуру БД не предлагать).

Суть проблемы состоит в том, я в скрипте начинаю проверять можно ли данное значение показателя привести к нужному типу, через CAST преобразую значение и вешаю на это преобразования обработчик исключений, если все хорошо то записываю в нужную мне таблицу, если нет то тоже записываю только с нужно пометкой.

В СУБД отрабатывает все коректно, а когда из программы вызываю сразу падает с ошибкой:
Microsoft SQL Server Native Client 10.0 MSSQL-3930: The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2014, 10:46
Ответы с готовыми решениями:

Try catch
Доброго времени суток нехочу наследовать диалог,тем более что набросал его за...

Try Catch
Здравствуйте, у меня есть код и нужно организовать такую вещь - чтобы при вводе...

TRY/CATCH
Здравствуйте! У меня есть: MASS; для простоты пояснения,...

try{} catch(){}
Как достать строковую переменную из try{} catch(){} //Создаем...

Try-catch
Добрый вечер, #include <iostream> using namespace std; void F1(int);...

7
invm
1929 / 1306 / 395
Регистрация: 02.06.2013
Сообщений: 3,309
24.07.2014, 11:38 2
Ошибка конвертации переводит транзакцию в uncommittable state (читать в документации про функцию xact_state).
Скрипт из студии у вас выполняется в режиме autocommit, без явной/неявной транзакции. Поэтому ошибки не возникает.
0
Maksim I.
0 / 0 / 1
Регистрация: 24.07.2012
Сообщений: 38
24.07.2014, 13:42  [ТС] 3
Вот такая ошибка падает и все.
SQL
1
Microsoft SQL Server Native Client 10.0 MSSQL-266: TRANSACTION COUNT after EXECUTE indicates a mismatching NUMBER OF BEGIN AND COMMIT statements. Previous COUNT = 1, CURRENT COUNT = 0.


Код:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
            OPEN @CURSOR 
            FETCH NEXT FROM @CURSOR INTO @t_TYPE_VALUE,@t_VAL_1,@t_VAL_2  
        WHILE @@FETCH_STATUS = 0  
        BEGIN
            SET NOCOUNT ON;  
            SET XACT_ABORT ON;
            BEGIN TRY 
            BEGIN TRANSACTION   
                --Проверка значения, если равен константе, возвращаем ошибку 
                SET @t_VAL_1 = CAST(@t_VAL_1 AS FLOAT);
                @t_MESSAGE_ERR = 'Все кул';
            COMMIT TRANSACTION 
            END TRY 
            BEGIN CATCH 
                SET @t_MESSAGE_ERR = 'Ошибка (формата числа)';
                IF (XACT_STATE()) = -1 
                BEGIN 
                    ROLLBACK TRANSACTION; 
                END; 
                IF (XACT_STATE()) = 1 
                BEGIN
                    COMMIT TRANSACTION; 
                END; 
            END CATCH       
            INSERT INTO @T_VALUES       (MESSAGE_ERR)  VALUES (@t_MESSAGE_ERR); 
            /*Выбираем следующую строку*/  
            FETCH NEXT FROM @CURSOR INTO @t_TYPE_VALUE,@t_VAL_1,@t_VAL_2  
        END
0
invm
1929 / 1306 / 395
Регистрация: 02.06.2013
Сообщений: 3,309
24.07.2014, 14:34 4
Maksim I., у вас есть внешняя, по отношению к процедуре, транзакция. В MSSQL вложенных транзакций нет, поэтому, когда вы в процедуре делаете rollback - откатывается все, вплоть до самого внешнего begin tran и @@trancount становится равным нулю и на выходе из процедуры получаете ошибку 266, потому что на входе в нее @@trancount было больше нуля.
0
Maksim I.
0 / 0 / 1
Регистрация: 24.07.2012
Сообщений: 38
24.07.2014, 14:55  [ТС] 5
То есть обойти данную ошибку не возможно?
0
invm
1929 / 1306 / 395
Регистрация: 02.06.2013
Сообщений: 3,309
24.07.2014, 15:01 6
Лучший ответ Сообщение было отмечено Maksim I. как решение

Решение

Maksim I., либо делать окат не том же уровне, где начата внешняя транзакция, либо делать проверку другими способами. Если у вас SQL Serever 2012, то в нем есть функции try_covert/try_cast. Либо можно написать SQLCLR-функцию.
1
Maksim I.
0 / 0 / 1
Регистрация: 24.07.2012
Сообщений: 38
24.07.2014, 15:16  [ТС] 7
А как - то ведь можно настроить сессию, чтобы сразу "auto commit" был??
0
invm
1929 / 1306 / 395
Регистрация: 02.06.2013
Сообщений: 3,309
24.07.2014, 15:38 8
Цитата Сообщение от Maksim I. Посмотреть сообщение
А как - то ведь можно настроить сессию, чтобы сразу "auto commit" был??
autocommit - режим по-умолчанию.
0
24.07.2014, 15:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2014, 15:38

Try/ catch
Здравствуйте! Подскажите кто может: как можно сделать так, чтобы try делал...

try . catch
можно ли провести данную операцию для функции erase у вектора??? пытался,...

try-catch
Доброго времени суток, начал изучать исключения, и вот есть такой код: //...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru