Обработка ограничений SqlException в Asp.net - PullRequest
1 голос
/ 17 февраля 2010

Предположим, у меня есть пользовательская таблица, которая создает прочные отношения (Enforce Foreign Key Constraint) со многими дополнительными таблицами. Таблица таких заказов ..

Если мы попытаемся удалить пользователя с некоторыми заказами, то возникнет SqlException. Как я могу перехватить это исключение и обработать его правильно?

Это вообще стратегия?

1) сначала попробуйте действие удаления, если исключение возникло?

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

Так как это сделать?

- Изменить:

Цель - не удалять записи из БД! цель состоит в том, чтобы сообщить пользователю, что эта запись имеет ссылки на записи. мне нужно разрешить sql выполнить команду удаления и попытаться поймать SqlException? И если да, то как определить, что это ограничение REFERENCE SqlException?

Или - мне нужно написать какой-нибудь код, который будет определять наличие ссылок на записи перед командой удаления. Последний подход дает мне больше, но очень тяжело реализовать такой вид проверки для каждой сущности.

Спасибо

1 Ответ

1 голос
/ 17 февраля 2010

Вы действительно хотите действительно удалить записи пользователя? Вместо этого я бы предложил иметь «удаленный» флаг в вашей базе данных, поэтому, когда вы «удаляете» пользователя через пользовательский интерфейс, все, что он делает, это обновляет эту запись, чтобы установить флаг в 1. В конце концов, вы бы не хотели удалить пользователей, у которых были заказы и т. д.

Тогда вам просто нужно поддерживать этот флаг в соответствующих областях (т.е. не отображать «удаленных» пользователей в пользовательском интерфейсе).

Edit:
"... но только для концепции, предположим, что я хочу удалить пользователя, как мне это сделать?"
Прежде чем удалять запись пользователя, вам нужно будет удалить записи из других таблиц, которые ссылаются на этого пользователя (т.е. сначала удалить ссылки , а затем удалить ссылки записи). Но для меня это не имеет смысла, так как вы удалили бы, например, данные заказа.

Редактировать 2:
«И если да, то как определить, что это ограничение ССЫЛКИ SqlException?»
Чтобы обнаружить эту конкретную ошибку, вы можете просто проверить SqlException.Number - я думаю, что для этой ошибки вам нужно проверить на 547 (это номер ошибки в SQL 2005). В качестве альтернативы, если вы используете SQL 2005 и выше, вы можете полностью обработать эту ошибку в SQL, используя поддержку TRY ... CATCH :

BEGIN TRY
    DELETE FROM User WHERE UserId = @MyUserId
END TRY
BEGIN CATCH
   IF (ERROR_NUMBER() = 547)
        BEGIN
            -- Foreign key constraint violation. Handle as you wish
        END
END CATCH

Однако я лично выполню предварительную проверку, как вы предложили, чтобы сохранить исключение. Это легко сделать с помощью проверки EXISTS, например:

IF NOT EXISTS(SELECT * FROM [Orders] WHERE UserId=@YourUserId)
    BEGIN
        -- User is not referenced
    END

Если есть еще таблицы, которые ссылаются на пользователя, вам также необходимо включить их в чек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...