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

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

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

26 ответов

30 просмотров

В компонентах доступа должен класс, возвращающий 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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта