Форум программистов, компьютерный форум, киберфорум
Наши страницы

Microsoft SQL Server

Войти
Регистрация
Восстановить пароль
 
Maksim I.
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 38
#1

TRY CATCH - SQL Server

24.07.2014, 10:46. Просмотров 1498. Ответов 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 (SQL Server):

try-catch - C++
Доброго времени суток, начал изучать исключения, и вот есть такой код: // new.cpp : Defines the entry point for the console...

Try catch - C++
try { throw pDoc->C; } catch (City) { return; } есть динамический City* C, ему присвается значение другого такого...

Try catch - C++ Qt
Qt c try/catch работает ? а то на delete( ui->lineEdit); try{ ui->lineEdit->setText("text"); } ...

Try и catch - C++
Пытался сделать простую структуру,чтобы в блоке try задавалось значение переменной x, и если это значение равно,например, 5,то блок catch...

try{} catch(){} - Java ME
Как достать строковую переменную из try{} catch(){} //Создаем форму Form firstForm=new Form("Добро...

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

7
invm
1720 / 1194 / 334
Регистрация: 02.06.2013
Сообщений: 2,997
24.07.2014, 11:38 #2
Ошибка конвертации переводит транзакцию в uncommittable state (читать в документации про функцию xact_state).
Скрипт из студии у вас выполняется в режиме autocommit, без явной/неявной транзакции. Поэтому ошибки не возникает.
0
Maksim I.
0 / 0 / 0
Регистрация: 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
1720 / 1194 / 334
Регистрация: 02.06.2013
Сообщений: 2,997
24.07.2014, 14:34 #4
Maksim I., у вас есть внешняя, по отношению к процедуре, транзакция. В MSSQL вложенных транзакций нет, поэтому, когда вы в процедуре делаете rollback - откатывается все, вплоть до самого внешнего begin tran и @@trancount становится равным нулю и на выходе из процедуры получаете ошибку 266, потому что на входе в нее @@trancount было больше нуля.
0
Maksim I.
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 38
24.07.2014, 14:55  [ТС] #5
То есть обойти данную ошибку не возможно?
0
invm
1720 / 1194 / 334
Регистрация: 02.06.2013
Сообщений: 2,997
24.07.2014, 15:01 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Maksim I., либо делать окат не том же уровне, где начата внешняя транзакция, либо делать проверку другими способами. Если у вас SQL Serever 2012, то в нем есть функции try_covert/try_cast. Либо можно написать SQLCLR-функцию.
1
Maksim I.
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 38
24.07.2014, 15:16  [ТС] #7
А как - то ведь можно настроить сессию, чтобы сразу "auto commit" был??
0
invm
1720 / 1194 / 334
Регистрация: 02.06.2013
Сообщений: 2,997
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 - C++
Какой тип проекта создавать в Visual Studio чтобы можно было сделать обработку исключений с try-catch? Или что сделать в Code Blocks с той...

try catch - C++
Здравствуйте. В c++ новичёк, с try catch никогда толком не работал, а тут пришлось. Нужно сделать защиту от ввода всего кроме цифр. вот...

try-catch - C++
Читаю книгу Страуструпа. Он пишет (стр 232), что можно не передавать обработчику исключений какое либо значение. #include...

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


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

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

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