Выдача ошибок в драйвере PostgreSQL

Обсуждение возникших проблем, предложений и ошибок dbExpress драйверов
Ответить
alexer
Сообщения: 5
Зарегистрирован: Пт 29 май 2015 12:22

Выдача ошибок в драйвере PostgreSQL

Сообщение alexer » Чт 15 дек 2016 16:48

Работаю в PostgreSQL 9.4 (база в кодировке UNICODE) на Delphi 7. Вопроса 2.

1. При возникновении ошибок драйвер выдает только первую строку от сообщение от сервера:

SQL Server error: operator does not exist: integer = character varying

однако SQL Manager for PostgreSQL выдает более понятную диагностику

SQL Server error: operator does not exist: integer = character varying
LINE 1: select INV_PORT FROM data.D_B_TDBS where DOC=varchar '124669...
^
Можно не обрезать сообщение от сервера?

2. При выдачи на сервере исключения на русском языке, например:
RAISE EXCEPTION '%', 'Попытка продублировать код ISO'

Драйвер выдает абракадабру
SQL Server error: 'Ïîïûòêà ïðîäóáëèðîâàòü êîä ISO'

SQL Manager for PostgreSQL выдает правильно:
SQL Server error: Попытка продублировать код ISO

Если на сервере исключение выдать с перекодировкой
RAISE EXCEPTION '%', convert_from(Message::bytea, 'WIN1251')

то тогда все наоборот, драйвер выдает правильно, а SQL Manager for PostgreSQL - нет.

Как настроить драйвер на выдачу сообщений в правильной кодировке?

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: Выдача ошибок в драйвере PostgreSQL

Сообщение AndreyZ » Пт 16 дек 2016 11:37

1. 'LINE 1: select INV_PORT FROM data.D_B_TDBS where DOC=varchar '124669...' - эту часть сообщения генерирует парсер SQL Manager for PostgreSQL на основе информации, которую возвращает PostgreSQL:

- номер ошибки;
- текст ошибки 'operator does not exist: integer = character varying';
- № строки, № позиции в строке и место возникновения ошибки в текстовом формате;

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

2. Мы воспроизвели описанное вами поведение и исследуем его. Мы сообщим вам о результатах.

Ответить