при вставке записи можно в ексепшине поймать по какому полю сработка, чтобы пользователю сгенерировать меседж человеческий?
В компонентах доступа должен класс, возвращающий GDSCode, как Дима выше написал. В самой базе могут быть определены и пользовательские эксцепшены. Можно отлавливать и их, например, ibx этот функционал поддерживает. Файрдак, по идее, должен, но я с ним не знаком
собственно, пользовательские в любом случае нужны, или в БД или в коде программы. потому что для простого человека любой текст про ошибку в столбце AB_CDE_0123_FGH никакой информации не несёт, только для программиста и иногда тех-поддержки а простые смертные работают со сложными понятиями, типа документов или предметов, которые в смысле БД состоят из нескольких строк в разных таблицах вообще поэтому, я думаю, никто и не пытается сделать "человеческие" ошибки сразу в БД на уровне например движка. Всё равно не поможет.
плюсую. юзеру показать текст что есть проблема. сохранить проблемный запрос и/или исключение в лог и его отдавать программистам на разбор. у нас так и работает
Могу сформулировать по другому. CONSTRAINT - это последняя линия обороны, это "прибить программу, которая делает плохое" Если сработал CONSTRAINT, то это уже ошибка в программе, которая не должна была никогда отправлять в БД сломанные запросы, которые эти CONSTRAINT ловят. Вот и подумай, где что доделать в программе ,чтобы CONSTRAINT никогда не срабатывал. Туда и человеческую ошибку вставлять, в понятных человекам терминах 😊
угу, ибо сам факт технической ошибки всплывшей до самого верху и означает, что в программе чего-то недодумали и какой-то сценарий не предусмотрели.
Ты щас с кем разговаривал? 😁🤌🏻
с вечностью. Нетленку для потомков оставлял
Есть поле телефон кастомера, оно уникально, при добавлении нового кастомера я думал ловить ексепшин если попытаются добавить уже существующий. Правильно я вас понял, что правильно в этом случае сделать запрос в базу на наличие номера телефона если номер присутствует сообщить об этом пользователю?
конкретно в этом, простейшем, случае может быть можно и перехватить ошибку и причесать задним числом. Но вообще - да. ну например, возьмём Россию. Выход на междугороднюю телефонную сеть, ещё с советских врёмен, это восьмёрка. Но ещё есть международный стандарт, по которому это +7. получаем, что телефоны +7-123-456-78-90 и 8-123-456-78-90 - это на самом деле один и тот же телефон. А вот для БД - это разные телефоны. то есть даже в этом простейшем случае нужна дополнительная обработка. дальше, по факту задвоения, что это было? - опечатка, которую надо поправить и ещё раз отправить? - забытый старый аккаунт, который надо восстановить? - identity theft, когда на чужое имя совершали разные действия, и надо в полицию обращаться? - нормальная ситуация, когда старый владелец номера его поетрял, а другой человек купил, и тогда надо удалить этот номер из старого аккаунта? вот уже 4 нетривиальных действия, и только навскидку. А казалось бы простейшая ошибка, проще некуда
У тебя в базе должен быть констрейнт на уникальность поля. При его нарушении сервер выдаст ошибку, которые компоненты доступа должны отловить в try..except
Дим, имхо, ему попроще надо - ты усложняешь и путаешь
тогда просто вот все то же ляжет на тех-поддержку, разруливать-то ситуацию придется все равно
Все так и есть, есть ексепшин но он выглядит страшно. [FireDAC][Phys][FB]violation of PRIMARY or UNIQUE KEY constraint "UNQ_CUSTOMER_PHONE" on table "CUSTOMERS" Problematic key value is ("PHONE" = '+4204521455') Идея была такая если UNQ_CUSTOMER_PHONE то пользователю сказать сорян, но такой кастомер есть. В доках фаердака есть такое if E.Kind = ekUKViolated then ShowMessage('Please enter unique value !'); Но я думал можно как то получить легко по какому полю ексепшин, так как в таблице несколько полей с констрейнами
Я в таких случаях в триггере BI/BU/BD возбуждаю пользовательское исключение, а на клиенте анализирую его и выдаю вменяемый текст. Если интересно, завтра выложу код для примера
спроси в https://t.me/firebird_friday но я думаю только разбором текста, который может оказаться на другом языке
Буду признателен
но ведь параметризованных исключений вроде так и не завезли? или сделали?
Я не знаю, что такое "параметризованные исключения", я сделал на каждый случай возможной ошибки отдельное исключение. Другое дело, что в тройке теперь можно писать комментарий к объектам базы на любом языке, наверное можно на клиенте не заморачиваться с "руссификацией" ошибки, а брать сразу комент и выдавать пользователю - пока не пробовал.
идея в том, чтобы формально добавит к исключению несколько переменных, как проперти у Exception, чтобы исключение одно, но был бы массив параметров, куда ты бы мог класть хоть столбец, хоть таблицу, а исключение бы создал только один раз но старый API этого не умел по определению поэтому разговор бродил кругами про курицу и яйцо, и я хз выбродило ли хоть что-нибудь
В тройке не видел
ну вот смотри, в базе пользовательские исключения, возбуждаются в триггере. На клиента обработчик, который анализирует ошибки и возвращает в try..except вменяемую ошибку (я для удобства сделал функцию). Но у меня FIB+ на дельфях, не знаю, как там Арефьевские компоненты устроены
Обсуждают сегодня