Как обработать ограничительные нарушения дб в пользовательском интерфейсе?

Можно использовать оператора case оператора switch, и некоторое время которые позволяют, Вы повториться эти Вводите значение , если 1, 2 или 3 не вставляется

 bool repeat = true;
 //here all your printf...
 while(repeat){
     printf("Enter value: ");
     scanf("%d", &value);
     repeat = false;
     switch(value){
          case 1:
                //manage case 1
                break;
          case 2:
                //manage case 2
                break;
           case 3:
                //manage case 3
                break;
           default:
                //manage the case value inserted is different from 1, 2 and 3
                repeat = true;      
     }
 }

Hope, это был usefoul.

12
задан Crescent Fresh 22 February 2009 в 18:57
поделиться

6 ответов

Хранимая процедура может использовать оператор RAISERROR, чтобы возвратить информацию об ошибке вызывающей стороне. Это может использоваться способом, который разрешает пользовательскому интерфейсу решать, как ошибка появится, разрешая хранимой процедуре предоставить подробную информацию ошибки.

RAISERROR можно назвать с message_id, серьезностью и состоянием, и с рядом ошибочных аргументов. При использовании этот путь сообщение с данным message_id, должно быть, было введено в базу данных с помощью sp_addmessage системной хранимой процедуры. Этот message_id может быть получен как свойство ErrorNumber в SqlException, который будет повышен в коде.NET, называя хранимую процедуру. Пользовательский интерфейс может затем выбрать какой сообщение или другой признак отобразиться.

Ошибочными аргументами заменяют в получающееся сообщение об ошибке так же к тому, как printf оператор работает в C. Однако, если Вы хотите просто пасовать назад аргументы UI так, чтобы UI мог решить, как использовать их, просто заставьте сообщения об ошибках не иметь никакого текста, просто заполнители для аргументов. Одно сообщение могло бы быть '"%s" | %d' для пасования назад аргумента строки (в кавычках), и числовой аргумент. Код.NET мог разделить их независимо и использовать их в пользовательском интерфейсе однако, Вам нравится.

RAISERROR может также использоваться в блоке ВЫГОДЫ ПОПЫТКИ в хранимой процедуре. Это позволило бы Вам фиксировать дублирующуюся ключевую ошибку и заменять ее Вашим собственным кодом ошибки, который означает, "делают дубликат ключа на вставке" к Вашему коду, и она может включать фактическое значение (значения) ключа. Ваш UI мог использовать, это для отображения "Номера заказа уже существует", где "x" был предоставленным значением ключа.

1
ответ дан 2 December 2019 в 21:24
поделиться

Мы не выполняем нашу бизнес-логику в базе данных, но у нас действительно есть вся наша серверная сторона проверки с DB низкого уровня операции CRUD разделенный от высокоуровневой бизнес-логики и кода контроллера.

Что мы пытаемся сделать, внутренне, раздают объект проверки с функциями как Validation.addError(message,[fieldname]). Различные прикладные уровни добавляют свои результаты проверки на этом объекте, и затем мы звоним Validation.toJson() для приведения к результату, который похож на это:

{
    success:false,
    general_message:"You have reached your max number of Foos for the day",
    errors:{
        last_name:"This field is required",
        mrn:"Either SSN or MRN must be entered",
        zipcode:"996852 is not in Bernalillo county. Only Bernalillo residents are eligible"
    }
}

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

Относительно ограничительных нарушений мы используем № 2, т.е. мы проверяем на потенциальные нарушения, прежде чем вставят/обновят и добавят ошибку к объекту проверки.

5
ответ дан 2 December 2019 в 21:24
поделиться

Проблемой является действительно одно из ограничения в архитектуре Вашей системы. Путем продвижения всей логики в базу данных необходимо обработать его в двух местах (в противоположность созданию слоя бизнес-логики, которая связывает UI с базой данных. С другой стороны, минута, у Вас есть слой бизнес-логики, Вы теряете все преимущества наличия логики в сохраненном procs. Не защищая один или другой. Оба сосут об одинаково. Или не сосите. В зависимости от того, как Вы смотрите на него.

Где я был?Правильно.

Я думаю, что комбинация 2 и 3 является, вероятно, способом пойти.

Путем предвосхищения ошибки можно создать ряд процедур, которые можно назвать из стоящего с UI кода, чтобы предоставить подробную определенную для реализации обратную связь пользователю. Необходимо не обязательно сделать это с ajax на основе поля полем, но Вы могли.

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

3
ответ дан 2 December 2019 в 21:24
поделиться

В защиту № 4 SQL Server имеет довольно организованную иерархию ошибочных предопределенных уровней серьезности. С тех пор, поскольку Вы указываете, что это должно хорошо обработать ошибки, где логика, я был бы склонен обработать это условно между SP и абстракцией UI, вместо того, чтобы добавить набор дополнительной связи. Тем более, что можно повысить ошибки и со значением и со строкой.

2
ответ дан 2 December 2019 в 21:24
поделиться

Я видел много основанных на Ajax приложений, делающих проверку в реальном времени на полях, таких как имя пользователя (чтобы видеть, существует ли оно уже), как только пользователь оставляет окно редактирования. Это кажется мне лучшим подходом, чем отъезд к базе данных для повышения исключения на основе ограничения дб - это является более превентивным, так как у Вас есть реальный процесс: получите значение, проверьте, чтобы видеть, допустимо ли это, покажите, что ошибка в противном случае позволяет продолжаться если никакая ошибка. Таким образом, кажется, что опция 2 является хорошей.

1
ответ дан 2 December 2019 в 21:24
поделиться

Это - то, как я делаю вещи, хотя это не может быть лучшим для Вас:

Я обычно иду для приоритетной модели, хотя она во многом зависит от Вашей архитектуры приложения.

Для меня (в моей среде) имеет смысл проверить на большинство ошибок в середине (бизнес-объекты) уровень. Это - то, где все другие определенная для бизнеса логика происходит, таким образом, я пытаюсь сохранить такое количество остальной части моей логики здесь также. Я думаю о базе данных как где-нибудь для сохранения моих объектов.

Когда дело доходит до проверки самые легкие ошибки могут быть захвачены в JavaScript (форматирование, длины поля, и т.д.), хотя, конечно, Вы никогда не предполагаете, что те проверки на ошибки произошли. В тех ошибках также регистрируются более безопасный, более управляемый мир серверного кода.

В бизнес-правилах (таких как "у Вас может только быть столько foos в день") регистрируются серверный код в слое бизнес-объекта.

Только в правилах данных регистрируются база данных (ссылочная целостность, уникальные полевые ограничения, и т.д.). Мы предвосхищаем проверку всех их на среднем уровне также, чтобы не поражать базу данных излишне.

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

1
ответ дан 2 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: