У меня тоже была такая же проблема несколько дней / месяцев назад. После долгих поисков я пришел к решению о переводе сообщений об ошибках в DAL с использованием класса SqlHelper.
Я решил эту проблему следующим образом.
Создано несколько классов, которые были получены из класса Exception, как показано на диаграмме .
DalExceptionClass:Exception
ForeignKeyException: DalException
в SqlHelper
public void ExecuteNonQuery(string procedure)
{
try
{
con.open()
cmd.executenonquery();
con.close();
//Sql Exception is raised
}
catch(SqlException ex)
{
throw TranslateException(ex);
}
}
используя код в ссылке, я перевел Sql исключения для DalException, а не исключения
protected DalException TranslateException(SqlException ex) {
DalException dalException = null;
// Return the first Custom exception thrown by a RAISERROR
foreach (SqlError error in ex.Errors) {
if (error.Number >= 50000) {
dalException = new DalException(error.Message, ex);
}
}
if (dalException == null) {
// uses SQLServer 2000 ErrorCodes
switch (ex.Number) {
case 2601:
// Unique Index/Constriant Violation
dalException = new DalUniqueConstraintException("{0} failed, {1} must be unique", ex);
break;
default:
// throw a general DAL Exception
dalException = new DalException(ex.Message, ex);
break;
}
}
// return the error
return dalException;
}
Обратите внимание, дело 2601:
Я отправил здесь заказное сообщение.
Теперь в моем DAL я буду обрабатывать только DalException, который вернет мне сообщение об исключении как
"{0} не удалось, {1} должен быть уникальным" с использованием string.Format (msg,
«Вставка», «Клиент»);
это отправит исключение в BAL, так как «вставка не удалась, клиент должен быть уникальным», что может быть несколько гранулированным сообщением.
Редактировать
это будет обработано в DAL как
public Client Insert()
{
try
{
_repository.Insert(client);
}
catch(DalException ex)
{
//wrap message since, error will always be in client entity as client's method is being called. Also, insertion is being failed.
throw new BusinessException(string.Format(ex.message), "Insertion", "Client");
}
}
Ссылки
Как преобразовать сообщение SqlException в удобное для пользователя сообщение
http://www.reflectionit.nl/DAL.aspx
Какой должна быть стратегия для обработки исключений sql?