Для PostgreSQL Вы могли использовать Другой Инструмент Разности PostgreSQL . Это может разность два Дампа SQL очень быстро (несколько секунд на дб приблизительно с 300 таблицами, 50 представлениями и 500 хранимыми процедурами). Таким образом, можно найти изменения легко и получить sql разность, которую можно выполнить.
От Страницы APGDiff:
Другой Инструмент Разности PostgreSQL является простым инструментом разности PostgreSQL, который полезен для обновлений схемы. Инструмент сравнивает два файла дампа схемы и создает выходной файл, который является (после некоторых модификаций ручной работы) подходящий для обновления старой схемы.
Насколько я понимаю, у вас есть три попытки / уловки - по одному для каждого уровня: DAL, BLL, UI.
Вы следует ловить только тогда, когда вы собираетесь что-то с этим сделать.
Насколько я понимаю, вы просто отказываетесь от DAL, поэтому в этом нет необходимости.
Из BLL вы регистрируете исключение, и это хорошая практика, поскольку вы смогу собирать данные об исключениях, чтобы в конечном итоге улучшить приложение.
Затем вы перехватываете уровень пользовательского интерфейса, чтобы преобразовать исключение во что-то удобное для пользователя. Все в порядке.
В отличие от других ответов, я советую также удалить try / catch из вашего пользовательского интерфейса. Ваш BLL должен перехватить исключение, зарегистрировать его, а затем предоставить некоторый механизм для пользовательского интерфейса, чтобы запросить, какие ошибки произошли.
Это приводит к гораздо более чистому пользовательскому интерфейсу, поскольку вам не нужно перечислять все возможные исключения, которые может бросить. Вы можете упростить свой пользовательский интерфейс до:
if (businessObject.doSomeOperation == true) {
// Do whatever you need to here.
} else {
// output error message from businessobject
// something like businessObject.LastErrorMessage();
}
вам нужно выбросить исключение и поймать его в пользовательском интерфейсе, например ... В BLL
try
{
//your code
}
catch (System.Data.SqlClient.SqlException ex)
{
if (ex.Number == 547)
{
throw new Exception("ActiveRecord");
}
}
finally
{
MasterConnection.Close();
}
Catech выполнение в пользовательском интерфейсе и отображение удобного для пользователя сообщения.
if (e.Exception != null)
{
if (e.Exception.InnerException.Message == "ActiveRecord")
{
//Show here User freind message
}
}