Всем привет!
Есть у меня пара вопросов:
Как я понял, при возникновении ошибки (допустим — нарушение ограничения NOT NULL) при выполнении,
допустим, хранимой процедуры, фреймовок преобразует это в исключение. Но почему после этого
продолжает выполнять эта хранимая процедура
create procedure dbo.AAA
as
raiserror('qwe', 16, 1)
--при инсерте произойдет ошибка
insert into Films (NAME) VALUES ('wer')
if @@ERROR <> 0
BEGIN
PRINT 'srewr'
END
SqlConnection connect = new SqlConnection("...");
SqlCommand comm = connect.CreateCommand();
comm.CommandText = "AAA";
comm.CommandType = CommandType.StoredProcedure;
try
{
connect.Open();
comm.ExecuteNonQuery();
}
catch( SqlException e )
{
MessageBox.Show(this, e.Message);
}
finally
{
connect.Close();
}
Выводится следующее:
qwe
Cannot insert the value NULL into column 'Country_ID', table 'Film.dbo.Films'; column does not allow nulls. INSERT
fails.
The statement has been terminated.
srewr
На кой нужно @@ERROR, если все равно обработкой ошибок занимается СКЛ Сервер. Я понимаю был бы
толе, если бы можно было отключить обработку ошибок СКЛ Сервером и "вручную", анализируя
содержимое @@ERROR, сигнализировать об ошибке.
Как я понял RAISERROR тоже фреймвоком преобразуется в SqlExeception. Но почему продолжается
выполнение хранимой процедуры?
Заранее спасибо.
Здравствуйте, Dr_Sh0ck, Вы писали:
DS>Есть у меня пара вопросов:
DS>Как я понял, при возникновении ошибки (допустим — нарушение ограничения NOT NULL) при выполнении,
DS>допустим, хранимой процедуры,[skip]. Но почему после этого
DS>продолжает выполнять эта хранимая процедура
так тебе же в процедуре возвращается код ошибки @@ERROR после каждого выполненого предложения. TSQL использует именно этот механизм, а не exception'ы, которые прерывают выполнение.
DS> На кой нужно @@ERROR, если все равно обработкой ошибок занимается СКЛ Сервер.
вот для этого и надо,
а вопрос здесь более правомочен: а при чем здесь framework ? SQL серверу глубоко по барабану на чем ты программирушь.
когда выйдет Visual Studio for Yukon, вот тогда уж...
Здравствуйте, Dr_Sh0ck, Вы писали:
DS>я имею ввиду почему нельзя каким нибудь оператором TSQL отключить в процедуре обработку ошибок SQL сервером.
CREATE PROCEDURE dbo.AAA
as
...
if @@ERROR <> 0
BEGIN
[обработка начатых транзакций]
RETURN(1)
END
Чем не устраивает, ведь процедуры пишешь сам?