Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Игнорирование Exception в C# при выполнения запроса.  [new]
Dragon Master
Member

Откуда: Зеленоград
Сообщений: 36
В программе генерится батч типа:

DECLARE @ErrorTable TABLE (ErrorRow int) 

BEGIN TRANSACTION 
INSERT INTO Flat ([FlatID], [DateFrom], [BuildingID], [FlatNr], [KWPNFlatNr], [ISGRSLFlatNr], [ISGRSLFlatID], [FloorNr], [PorchNr]) 
VALUES (16301, '2004-09-01 00:00:00', 25, '29', '29', '29', 35785, '8', '1')  
IF @@ERROR <> 0 BEGIN 
ROLLBACK TRANSACTION 
INSERT INTO @ErrorTable (ErrorRow) VALUES (0) END 
ELSE COMMIT TRANSACTION  

BEGIN TRANSACTION 
INSERT INTO Flat ([FlatID], [DateFrom], [BuildingID], [FlatNr], [KWPNFlatNr], [ISGRSLFlatNr], [ISGRSLFlatID], [FloorNr], [PorchNr]) 
VALUES (16302, '2004-09-01 00:00:00', 25, '3', '3', '3', 35760, '1', '1')  
IF @@ERROR <> 0 BEGIN 
ROLLBACK TRANSACTION 
INSERT INTO @ErrorTable (ErrorRow) VALUES (1) END 
ELSE COMMIT TRANSACTION 

...................................

SELECT * FROM @ErrorTable

Таких инсертов/апдейтов в батче может быть сотня и более. Это сделано, что бы не гонять на сервер по одному запросу.

Если какой либо инсерт выполнился с ошибкой (повторяющиеся ключи, например) то в @ErrorTable записывается его номер, а в программе соответствующим образом обрабатывается.

Но вот проблема - если инсерт ошибочный, C# тут же выбрасывает ошибку! Нельзя получить ни номер ряда, ни выполнить последующие инсерты.

Adapter = new OleDbDataAdapter(SQLString, Connection);
DataTable BatchResult = new DataTable();
Adapter.Fill(BatchResult);

try..catch не поможет - батч все равно не выполнится до конца :(

Облазил уже все, что мог! ничего не нашел.......
25 авг 05, 10:24    [1815793]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35766
автор
Но вот проблема - если инсерт ошибочный, C# тут же выбрасывает ошибку!

А может это не C#? Есть такие ошибки, которые на месте валят батч, и вся обработка на сервере - побоку.
25 авг 05, 10:26    [1815803]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74900
автор
В программе генерится батч типа:
...
Таких инсертов/апдейтов в батче может быть сотня и более. Это сделано, что бы не гонять на сервер по одному запросу.


И накой ляд, Вы каждый INSERT в транзакцию заварачиваете, вместо того, чтоб выполнить все в одной?! 8)
25 авг 05, 10:31    [1815831]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Dragon Master
Member

Откуда: Зеленоград
Сообщений: 36
автор
А может это не C#? Есть такие ошибки, которые на месте валят батч, и вся обработка на сервере - побоку.


Я выполнял этот батч (специально с ошибкой) в Query Analyzer. все происходит так, как и задумывалось - возвращается таблица со списком ошибок, всё правильное добавляется.
25 авг 05, 10:31    [1815833]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Dragon Master
Member

Откуда: Зеленоград
Сообщений: 36
автор
И накой ляд, Вы каждый INSERT в транзакцию заварачиваете, вместо того, чтоб выполнить все в одной?! 8)

Транзакции можно и убрать (изначально делал, что бы можно было отменить только конкртный результат, вместо всего), но проблему это не решит...
25 авг 05, 10:33    [1815852]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35766
Ставьте set nocount on вначале или листайте рекордсеты на клиенте.
25 авг 05, 10:35    [1815865]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Yuri Abele
Member

Откуда: Латвия -> Литва -> Тольятти -> Karlsruhe
Сообщений: 1537
Попробуй между транзакциями разделитель пакетов (GO) вставить.
25 авг 05, 10:40    [1815900]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74900
Yuri Abele
Попробуй между транзакциями разделитель пакетов (GO) вставить.


GO - это не инструкци T-SQL, а разделитель бачей, который понимают утилиты QA, OSQL, ISQL.
25 авг 05, 10:46    [1815930]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23903
Что то уж больно вся эта байда напоминает способ генерации скрипта в Red Gate SQL Bundle.
Только там ребята проще обошлись. Какой смысл продолжать пакет, если произошла ошибка?
Да и смысла вообще нет писать такое в клиенте, если можно все изменения по отдельности выполнять и ловить ошибку... чуть сложней, зато полная обработка...
Что-то не понятно, что автор этаким алгоритмом добивается...
25 авг 05, 10:52    [1815976]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Dragon Master
Member

Откуда: Зеленоград
Сообщений: 36
автор
Ставьте set nocount on вначале


Не помогло...

автор
листайте рекордсеты на клиенте.


То есть?

автор
Попробуй между транзакциями разделитель пакетов (GO) вставить.


Не помогло...

автор
Какой смысл продолжать пакет, если произошла ошибка?


Если в пакете из 100 только одна ошибка, то нужно, что бы 99 прошло, а 1 был (например) выведен в интерфейс.

автор
можно все изменения по отдельности выполнять и ловить ошибку


Проверено - так значительно быстрее.
25 авг 05, 10:58    [1816002]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

2 Dragon Master:

Что значит "если инсерт ошибочный"? Неверный синтаксис запроса?

Posted via ActualForum NNTP Server 1.3

25 авг 05, 11:06    [1816066]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

В начало батча SET XACT_ABORT OFF попробуй поставить

Posted via ActualForum NNTP Server 1.3

25 авг 05, 11:09    [1816082]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23903
Dragon Master
автор
можно все изменения по отдельности выполнять и ловить ошибку


Проверено - так значительно быстрее.
Зато так - гибче.
25 авг 05, 11:09    [1816085]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Dragon Master
Member

Откуда: Зеленоград
Сообщений: 36
автор
Что значит "если инсерт ошибочный"? Неверный синтаксис запроса?


Как пример - в таблице уже присутствует запись с идентичными ключевыми значениями. Кроме инсертов там могут быть апдейты...
25 авг 05, 11:09    [1816089]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Dragon Master
Member

Откуда: Зеленоград
Сообщений: 36
tpg
Dragon Master
автор
можно все изменения по отдельности выполнять и ловить ошибку


Проверено - так значительно быстрее.
Зато так - гибче.


Это понятно, но приходится оптимизировать.
25 авг 05, 11:13    [1816105]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Dragon Master
Member

Откуда: Зеленоград
Сообщений: 36
Roman S. Golubin

В начало батча SET XACT_ABORT OFF попробуй поставить


Не помогло...
25 авг 05, 11:18    [1816131]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Roman S. Golubin

2 Dragon Master:

Что значит "если инсерт ошибочный"? Неверный синтаксис запроса?


Если сработал один из Constraints, то произойдет выход из пакета по ошибке типа 547 и подобной. Выдайте свой INSERT в QA и посмотрите, какая ошибка вернется..
С уважением, Алексей.
25 авг 05, 11:19    [1816134]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Dragon Master
Member

Откуда: Зеленоград
Сообщений: 36
Aleksey-K
Roman S. Golubin

2 Dragon Master:

Что значит "если инсерт ошибочный"? Неверный синтаксис запроса?


Если сработал один из Constraints, то произойдет выход из пакета по ошибке типа 547 и подобной. Выдайте свой INSERT в QA и посмотрите, какая ошибка вернется..
С уважением, Алексей.


Server: Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK_Flat'. Cannot insert duplicate key in object 'Flat'.
The statement has been terminated.
25 авг 05, 11:27    [1816181]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

2 Aleksey-K:

Если установлен XACT_ABORT в OFF, то выхода не будет и транзакция сервером откачена не будет. Дальше - траблы на клиенте.

2 Dragon Master:

Вы на клиенте транзакцией управляете или AutoCommit стоит?

Попробуйте (на клиенте):

SQLConnection Conn = New SQLConnection(...);
SQLCommand Cmd = New SQLCommand;
Conn.Open();

SQLTransaction Txn = Conn.BeginTransaction();
Cmd.Transaction = Txn;

.... Cmd.Execute ....

Tnx.Commit();
....


Posted via ActualForum NNTP Server 1.3

25 авг 05, 11:29    [1816189]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
[/quot]
Server: Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK_Flat'. Cannot insert duplicate key in object 'Flat'.
The statement has been terminated.[/quot]
Вот и ответ !!!
У вас сработал PRIMARY KEY constraint по полю FlatID и произошел выход из пакета. До вашей IF @@ERROR дело не дошло !
Перед вставкой не мешает проверить, что такого FlatID еще нет.
С уважением, Алексей.
25 авг 05, 11:31    [1816196]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
Roman S. Golubin

2 Aleksey-K:

Если установлен XACT_ABORT в OFF, то выхода не будет и транзакция сервером откачена не будет.

Отката транзакции не будет, а выход из пакета будет при нарушении constraint будет и при SET XACT_ABORT OFF.
С уважением, Алексей.
25 авг 05, 11:35    [1816220]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Dragon Master
Member

Откуда: Зеленоград
Сообщений: 36
Aleksey-K

Server: Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK_Flat'. Cannot insert duplicate key in object 'Flat'.
The statement has been terminated.[/quot]
Вот и ответ !!!
У вас сработал PRIMARY KEY constraint по полю FlatID и произошел выход из пакета. До вашей IF @@ERROR дело не дошло !
Перед вставкой не мешает проверить, что такого FlatID еще нет.
С уважением, Алексей.[/quot]

Однако QA выполняет весь бач!
25 авг 05, 11:39    [1816244]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

Aleksey-K
выход из пакета будет при нарушении constraint будет и при SET XACT_ABORT OFF

Вы уверены? Может проверим?:

drop table #t
create table #t (id int primary key)
go
insert #t select 1
go
SET XACT_ABORT ON
begin transaction
insert #t select 1
commit transaction
begin transaction
insert #t select 4
commit tran
go
SET XACT_ABORT OFF
begin transaction
insert #t select 1
commit tran
begin transaction
insert #t select 3
commit tran
go
select * from #t


Posted via ActualForum NNTP Server 1.3

25 авг 05, 11:39    [1816250]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

2 Dragon master:

Вы попробовали SET XACT_ABORT OFF в начало батча и ручное управление транзакцией на клиенте?

Posted via ActualForum NNTP Server 1.3

25 авг 05, 11:41    [1816259]     Ответить | Цитировать Сообщить модератору
 Re: Игнорирование Exception в C# при выполнения запроса.  [new]
Dragon Master
Member

Откуда: Зеленоград
Сообщений: 36
Roman S. Golubin

2 Dragon master:

Вы попробовали SET XACT_ABORT OFF в начало батча и ручное управление транзакцией на клиенте?


Только что. Тот же результат....
25 авг 05, 11:43    [1816274]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить