это мой зрХранимая процедура не возвращает 0
CREATE PROCEDURE DeteleTitle
(
@TitleID int
)
AS
BEGIN
IF EXISTS(Select TitleID from Titles WHERE [email protected])
BEGIN
DELETE FROM Titles WHERE [email protected]
SELECT @TitleID
END
ELSE
BEGIN
SELECT 0
END
END
метод, где я называю это: -
public Int32 DeleteTitle(Int32 TitleID)
{
try
{
int ds=0;
SqlParameter[] sqlparam=new SqlParameter[1];
sqlparam[0]=(@TitleID,TitleID);
ds=Convert.ToInt32(SqlHelper.ExecuteScalar(ConfigurationManager.ConnectionStrings["con"].ConnectionString,CommandType.StoredProcedure,"DeleteTitle",sqlparam).Tables[0]);
return ds;
}
catch(Exception ex)
{
return 0;
}
}
Теперь TitleID является внешним ключом во многих таблицах. Если в записи какой-либо таблицы используется TitleID, тогда она выдает это исключение, в котором говорится «Нарушение внешнего ключа n». В моей Хранимой процедуре выше я выбираю нуль в блоке else, если удаление не выполняется. Когда delete IS успешно, он возвращает значение TitleID как 50, 99 или что-то еще. Теперь, что происходит, когда удаление не выполняется, оно не возвращает ноль. Я хотел, чтобы сообщение отображалось на экране, основанное на этом нулевом значении, возвращаемом методом «Удалить сохраненную», но когда оно не вернуло никакого значения (при неудачном удалении), я возвратил нуль в блоке catch моего метода DeleteTitle().
Теперь у меня есть два вопроса: -
- Почему Хранимая процедура не возвращает ноль, если удаление не удалось?
- Возвращает ноль в блоке catch, как я сделал выше правильного пути? Я не знал, как вы извлекаете номер Exception внешнего ключа и прочее, поэтому я просто вернул нуль в catch catch.
Вы должны, по крайней мере, поймать sqlexception (я считаю, что это правильно, если не искать).В настоящее время вы обнаруживаете всевозможные несвязанные исключения здесь и потенциально игнорируете их. Вы должны действительно улавливать определенные исключения, чтобы любые неожиданные могут перейти к обработчику ошибок на уровне приложений для соответствующей обработки и регистрации и что-то еще. – Chris