powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Возврат ошибки из ХП
11 сообщений из 11, страница 1 из 1
Возврат ошибки из ХП
    #33455516
m4za
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть ХП изменения строки. Как узнать, если строка с заданным ID была уже удалена другим пользователем?
А то в данном случае после вызова ХП у меня не вылезает никаких ошибок, и программа продолжает функционировать как и раньше, хотя строки на сервере уже давно нету.

create procedure ComponentUpdate
(
@ID int,
@field1 nvarchar(50)
)
as
update table1
set field1=@field1
where ID=@ID
GO
...
Рейтинг: 0 / 0
Возврат ошибки из ХП
    #33455637
Фотография StalkerS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create procedure ComponentUpdate
(
@ID int,
@field1 nvarchar(50)
)
as
update table1
set field1=@field1
where ID=@ID
if @@rowcount=0 raiserror('Нету строчки-то, нееету !',18,1)
GO
...
Рейтинг: 0 / 0
Возврат ошибки из ХП
    #33455752
m4za
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ, я тоже уже так сделал.

Вопрос на будущее: А что если вдруг редактирование строки невозможно из-за того, что она участвует в транзакции другого пользователя с уровнем изоляции, который запрещает обращение к строке (редактирование)? Хотя строка на самом деле существует, raiserror то все равно будет вызван.
...
Рейтинг: 0 / 0
Возврат ошибки из ХП
    #33455797
Фотография StalkerS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>Хотя строка на самом деле существует, raiserror то все равно будет вызван.

нет, не будет вызван, ваша транзакция будет ждать окончания той, что заблокировало строку, и потом благополучно ее обновит
...
Рейтинг: 0 / 0
Возврат ошибки из ХП
    #33455904
m4za
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Но допустим я запускаю такую команду (ХП) в приложении.
try
{
..
myConnection.Open();
myCommand.ExecuteNonQuery()
myConnection.Close();
..
}
catch (SqlException ex1)
{
//Как мне вот здесь узнать, что был вызван именно RAISERROR на сервере,
//а не какая-то другая ошибка (например, сервер не доступен)?
}
...
Рейтинг: 0 / 0
Возврат ошибки из ХП
    #33455922
m4za
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или допустим, как при удалении строки через ХП узнать была она уже удалена или ее невозможно удалить из-за ограниченний внешних ключей?
Это очень важно!
...
Рейтинг: 0 / 0
Возврат ошибки из ХП
    #33456012
saint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SqlException exc

exc.Errors[0].Message // и другие св-ва

посмотрите в MSDN SqlException и SqlError
...
Рейтинг: 0 / 0
Возврат ошибки из ХП
    #33456057
Фотография StalkerS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в блоке catch отлавливаете текст ошибки, и по нему решаете, что там делать дальше
...
Рейтинг: 0 / 0
Возврат ошибки из ХП
    #33456081
m4za
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А допустим я вставляю в дочерную таблицу значение. А в главной таблице строка была уже удалена. Тогда ошибка будет выглядеть примерно так:

INSERT statement conflicted with COLUMN FOREIGN KEY constraint 'FK_SlaveTable_MasterTable'. The conflict occurred in database 'KCL', table 'KCL_MasterTable', column 'ID'.
The statement has been terminated.

Мне что, придется прописывать такую строку в catch, чтобы не спутать его с другой ошибкой (сервер не доступен). Может есть какие-то сокращенные коды ошибок?
...
Рейтинг: 0 / 0
Возврат ошибки из ХП
    #33456183
Фотография StalkerS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем-же всю строку, имя ограничения, вызвавшего ошибку будет уникальным, к примеру, в данном случае можно определить, содержит-ли строка с ошибкой текст 'FK_SlaveTable_MasterTable', выглядеть это может например так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
catch (Exception ex)
{
 if (ex.Message.IndexOf("FK_SlaveTable_MasterTable")!=- 1 )
 {					
	MessageBox.Show(this, "Вводимое значение отсутствует в главной таблице",MessageBoxButtons.OK ,MessageBoxIcon.Error);		
 } 
else
{
MessageBox.Show(this, "Произошла неизвестная ошибка:"+ex.Message.ToString());				
return;
}
...
Рейтинг: 0 / 0
Возврат ошибки из ХП
    #33456238
m4za
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощь. Про IndexOf() не посмотрел
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Возврат ошибки из ХП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]