169 похожих чатов

Подскажите пожалуйста База firebird Компоненты доступа firedac В таблице есть несколько полей с constraintами Как

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

26 ответов

18 просмотров

В компонентах доступа должен класс, возвращающий GDSCode, как Дима выше написал. В самой базе могут быть определены и пользовательские эксцепшены. Можно отлавливать и их, например, ibx этот функционал поддерживает. Файрдак, по идее, должен, но я с ним не знаком

Ed Doc
В компонентах доступа должен класс, возвращающий G...

собственно, пользовательские в любом случае нужны, или в БД или в коде программы. потому что для простого человека любой текст про ошибку в столбце AB_CDE_0123_FGH никакой информации не несёт, только для программиста и иногда тех-поддержки а простые смертные работают со сложными понятиями, типа документов или предметов, которые в смысле БД состоят из нескольких строк в разных таблицах вообще поэтому, я думаю, никто и не пытается сделать "человеческие" ошибки сразу в БД на уровне например движка. Всё равно не поможет.

Arioch The
собственно, пользовательские в любом случае нужны,...

плюсую. юзеру показать текст что есть проблема. сохранить проблемный запрос и/или исключение в лог и его отдавать программистам на разбор. у нас так и работает

Могу сформулировать по другому. CONSTRAINT - это последняя линия обороны, это "прибить программу, которая делает плохое" Если сработал CONSTRAINT, то это уже ошибка в программе, которая не должна была никогда отправлять в БД сломанные запросы, которые эти CONSTRAINT ловят. Вот и подумай, где что доделать в программе ,чтобы CONSTRAINT никогда не срабатывал. Туда и человеческую ошибку вставлять, в понятных человекам терминах 😊

Handatros
плюсую. юзеру показать текст что есть проблема. со...

угу, ибо сам факт технической ошибки всплывшей до самого верху и означает, что в программе чего-то недодумали и какой-то сценарий не предусмотрели.

Ed Doc
Ты щас с кем разговаривал? 😁🤌🏻

с вечностью. Нетленку для потомков оставлял

Sasha-Sch Автор вопроса
Arioch The
Могу сформулировать по другому. CONSTRAINT - это п...

Есть поле телефон кастомера, оно уникально, при добавлении нового кастомера я думал ловить ексепшин если попытаются добавить уже существующий. Правильно я вас понял, что правильно в этом случае сделать запрос в базу на наличие номера телефона если номер присутствует сообщить об этом пользователю?

Sasha Sch
Есть поле телефон кастомера, оно уникально, при до...

конкретно в этом, простейшем, случае может быть можно и перехватить ошибку и причесать задним числом. Но вообще - да. ну например, возьмём Россию. Выход на междугороднюю телефонную сеть, ещё с советских врёмен, это восьмёрка. Но ещё есть международный стандарт, по которому это +7. получаем, что телефоны +7-123-456-78-90 и 8-123-456-78-90 - это на самом деле один и тот же телефон. А вот для БД - это разные телефоны. то есть даже в этом простейшем случае нужна дополнительная обработка. дальше, по факту задвоения, что это было? - опечатка, которую надо поправить и ещё раз отправить? - забытый старый аккаунт, который надо восстановить? - identity theft, когда на чужое имя совершали разные действия, и надо в полицию обращаться? - нормальная ситуация, когда старый владелец номера его поетрял, а другой человек купил, и тогда надо удалить этот номер из старого аккаунта? вот уже 4 нетривиальных действия, и только навскидку. А казалось бы простейшая ошибка, проще некуда

Sasha Sch
Есть поле телефон кастомера, оно уникально, при до...

У тебя в базе должен быть констрейнт на уникальность поля. При его нарушении сервер выдаст ошибку, которые компоненты доступа должны отловить в try..except

Arioch The
конкретно в этом, простейшем, случае может быть мо...

Дим, имхо, ему попроще надо - ты усложняешь и путаешь

Ed Doc
Дим, имхо, ему попроще надо - ты усложняешь и пута...

тогда просто вот все то же ляжет на тех-поддержку, разруливать-то ситуацию придется все равно

Sasha-Sch Автор вопроса
Ed Doc
У тебя в базе должен быть констрейнт на уникальнос...

Все так и есть, есть ексепшин но он выглядит страшно. [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 !'); Но я думал можно как то получить легко по какому полю ексепшин, так как в таблице несколько полей с констрейнами

Sasha Sch
Все так и есть, есть ексепшин но он выглядит страш...

Я в таких случаях в триггере BI/BU/BD возбуждаю пользовательское исключение, а на клиенте анализирую его и выдаю вменяемый текст. Если интересно, завтра выложу код для примера

Sasha Sch
Все так и есть, есть ексепшин но он выглядит страш...

спроси в https://t.me/firebird_friday но я думаю только разбором текста, который может оказаться на другом языке

Sasha-Sch Автор вопроса
Ed Doc
Я в таких случаях в триггере BI/BU/BD возбуждаю по...

но ведь параметризованных исключений вроде так и не завезли? или сделали?

Arioch The
но ведь параметризованных исключений вроде так и н...

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

Ed Doc
Я не знаю, что такое "параметризованные исключения...

идея в том, чтобы формально добавит к исключению несколько переменных, как проперти у Exception, чтобы исключение одно, но был бы массив параметров, куда ты бы мог класть хоть столбец, хоть таблицу, а исключение бы создал только один раз но старый API этого не умел по определению поэтому разговор бродил кругами про курицу и яйцо, и я хз выбродило ли хоть что-нибудь

Sasha Sch
Буду признателен

ну вот смотри, в базе пользовательские исключения, возбуждаются в триггере. На клиента обработчик, который анализирует ошибки и возвращает в try..except вменяемую ошибку (я для удобства сделал функцию). Но у меня FIB+ на дельфях, не знаю, как там Арефьевские компоненты устроены

Ed Doc
screenshot

А почему ты сообщение просто показываешь, глуша исключение?

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

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта