вопрос по PostgreSQL

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

вопрос по PostgreSQL

Сообщение grigoreo » 16.03.2009 15:00:29

Незнаю это глобально или нет, но столкнулся на примере с постгрэ ,

во первых как у компонента TPQConnection при выполнении метода TPQConnection.Open узнать активировалось соединение или нет,помнится в Делфи можно было определить событие AfterConnect, но тут при попытке его сгенерить в листинге оно появляется,а вот в как в инспекторе объекта оно не привязывается даже явно ручками, в итоге проблемка обработать неудачный конект к базе

и второе, тоже в сравнении с делфями, использовал компоненты Zeos при работе с ними насколько я помню у меня после завершения селектов блокировки с представлений в постгрэ снимались после запроса, а теперь при использовании лазарусных компонентов, пока конект в принципе активен висят блокировки на все таблицы и ресурсы каторые я хоть раз задействовал, как это можно обойти, получается я немогу делать изменения в базе пока какието сесии активны
(юзал бы Zeos тем более что есть компоненты для лазаря, но уткнулся в проблему отображения руских букв в DBGrid, рисуются вопросики, пробовал серверу говорить какую кодировку выдавать клиенту принудительно все равно Zeos работает с ansi а DBGrid хочет руские буквы в юникоде, каждый раз ловить событие OnDrawColumnCell и делать перекодировку тоже муторно, все равно рисуется кривовато)
Аватара пользователя
grigoreo
постоялец
 
Сообщения: 195
Зарегистрирован: 10.03.2009 15:43:43
Откуда: С нашей Раши

Re: вопрос по PostgreSQL

Сообщение Logo » 16.03.2009 15:45:39

grigoreo писал(а):...событие AfterConnect, но тут при попытке его сгенерить в листинге оно появляется,а вот в как в инспекторе объекта оно не привязывается даже явно ручками, в итоге проблемка обработать неудачный конект к базе

Есть на данный момент такая проблема. Вы можете выйти с положения прописав вручную присвоение:
Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
begin
  PQConnection1.AfterConnect := @PQConnection1AfterConnect;
end;

по Zeos, к сожалению, ничего подсказать не могу.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: вопрос по PostgreSQL

Сообщение grigoreo » 16.03.2009 16:12:27

Logo
Спасибо такой вариант присвоения сработал на ура
Аватара пользователя
grigoreo
постоялец
 
Сообщения: 195
Зарегистрирован: 10.03.2009 15:43:43
Откуда: С нашей Раши

Re: вопрос по PostgreSQL

Сообщение Vadim » 17.03.2009 06:27:13

Вообще-то Zeos'у по барабану с какой кодировкой работать. Вот я, к примеру, задал кодировку UTF-8 своей базе и работаю без малейших проблем. Если кодировка базы отличается от кодировки вывода на экран, то надо пользоваться возможностями сервера БД по автоматической перекодировке. К примеру FireBird и MySQL перекодировку делают. Про Postgre не знаю, никогда с ней не работал.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: вопрос по PostgreSQL

Сообщение grigoreo » 17.03.2009 12:59:54

Vadim писал(а):Вообще-то Zeos'у по барабану с какой кодировкой работать. Вот я, к примеру, задал кодировку UTF-8 своей базе и работаю без малейших проблем. Если кодировка базы отличается от кодировки вывода на экран, то надо пользоваться возможностями сервера БД по автоматической перекодировке. К примеру FireBird и MySQL перекодировку делают. Про Postgre не знаю, никогда с ней не работал.


Ну скорее всего ты меня не так понял, или я не так, но если можешь поправь, как я понял ситуация такая, сама база у меня в UTF8, я так понял Zeos держит анси кодировки, и естественно серверу я говорю чтобы он перекодил в 1251 , а вот дальше сам лазарь держит UTF8 и то что пришло в Зеос чтобы отобразилось в DBGrid -е Лазаря надо перекодировать в UTF8 ?,но это проблемно
Аватара пользователя
grigoreo
постоялец
 
Сообщения: 195
Зарегистрирован: 10.03.2009 15:43:43
Откуда: С нашей Раши

Re: вопрос по PostgreSQL

Сообщение Vadim » 17.03.2009 13:34:56

grigoreo писал(а):...Zeos держит анси кодировки...

Вот это вот поясните подробно - непонятно.
Ещё раз. У меня база в UTF-8 и я ничего никуда не перекодирую. Работаю с базой посредством Zeos.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: вопрос по PostgreSQL

Сообщение grigoreo » 17.03.2009 15:11:53

Vadim писал(а):
grigoreo писал(а):...Zeos держит анси кодировки...

Вот это вот поясните подробно - непонятно.
Ещё раз. У меня база в UTF-8 и я ничего никуда не перекодирую. Работаю с базой посредством Zeos.


А можете для примера выложить выдержки по созданию пустой болванки на Лазарусе для отображения таблички из СУБД и какие свойства контролов инициализируете, чтобы табличка из руских букв показывалась читабельно как в содержимом ячеек так и в названиях полей если они тоже состоят из руских букв, т.е я так понимаю только конект и квери будут взяты из Зеос остальное из стандартных средств Лазаря...
Аватара пользователя
grigoreo
постоялец
 
Сообщения: 195
Зарегистрирован: 10.03.2009 15:43:43
Откуда: С нашей Раши

Re: вопрос по PostgreSQL

Сообщение Vadim » 17.03.2009 16:35:36

Хм... Чем дальше, тем страньше... :)
TZConnection - там описываются свойства соединения с БД:
- имя сервера БД
- тип сервера БД (выбирается из списка)
- логин
- пароль
- название БД
TZQuery:
- Connection - TZConnection
- SQL - 'SELECT названия, полей FROM таблица WHERE условие выборки ORDER BY поле_сортировки'
TDatasource:
- DataSet - TZQuery
TDBGrid
- DataSource - TDatasource
- а вот название и расположение колонок я прописываю вручную, т.к. имена полей у меня на латинице, а я хочу видеть русские названия.
-------------
Это всё. Данные отображаются на русском языке
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: вопрос по PostgreSQL

Сообщение grigoreo » 17.03.2009 16:48:13

Vadim писал(а):Хм... Чем дальше, тем страньше... :)
TZConnection - там описываются свойства соединения с БД:
- имя сервера БД
- тип сервера БД (выбирается из списка)
- логин
- пароль
- название БД
TZQuery:
- Connection - TZConnection
- SQL - 'SELECT названия, полей FROM таблица WHERE условие выборки ORDER BY поле_сортировки'
TDatasource:
- DataSet - TZQuery
TDBGrid
- DataSource - TDatasource
- а вот название и расположение колонок я прописываю вручную, т.к. имена полей у меня на латинице, а я хочу видеть русские названия.
-------------
Это всё. Данные отображаются на русском языке


Ну почему странее , вот и я не пойму в делфи все работала перешел на лазаря не отображается,(если только принудительно не кодировать из asci в UTF8)
по поводу ручками названия прописывать так для этого давно представления придуманы, основную таблицу в енглише планируем а в хранимом представлении делаем через AS руские названия,
По идее должны руские буквы видется если база в UTF8 то без перекодировки т.к Лазарус ее по умолчанию тащит, или все таки раз вы на жарптице может с ней то как раз все ок, а дело в клиенте Postgre, и его взаимосвязи с компонентами Zeos
Аватара пользователя
grigoreo
постоялец
 
Сообщения: 195
Зарегистрирован: 10.03.2009 15:43:43
Откуда: С нашей Раши

Re: вопрос по PostgreSQL

Сообщение Vadim » 17.03.2009 17:08:19

grigoreo писал(а):сли только принудительно не кодировать из asci в UTF8

Так у Вас БД в кодировке ASCI?
grigoreo писал(а):по поводу ручками названия прописывать так для этого давно представления придуманы, основную таблицу в енглише планируем а в хранимом представлении делаем через AS руские названия

Не годится! Я в коде работаю с названиями полей, а постоянно переключать раскладку при написании кода меня сильно напрягает. Я уж лучше по старинке - с латинскими названиями полей.
grigoreo писал(а):а дело в клиенте Postgre

Не исключено. Хотя и маловероятно. Клиентской DLL'ке тоже абсолютно по барабану кодировка. Она обязана обратится к серверу и выдать на гора полученные сведения. Если бы клиентские DLL'ки у серверов БД работали только в одной определённой кодировке - грош цена таким СУБД.
Ещё раз могу заверить, с чем лично я работал - SQLite, MySQL, FireBird - базы в кодировке UTF-8, отображение русских букв идёт без малейших претензиев.

Добавлено спустя 1 минуту 9 секунд:
А версия ZEOS какая?

Добавлено спустя 1 минуту 42 секунды:
Вы клиентскую DLL'ку используете ту, что шла в комплекте с Вашей СУБД?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: вопрос по PostgreSQL

Сообщение alexs » 17.03.2009 20:45:46

grigoreo писал(а):Zeos держит анси кодировки, и естественно серверу я говорю чтобы он перекодил в 1251

Вот это лишнее - при подключении укажите кодировку UTF8
в птице именно так.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: вопрос по PostgreSQL

Сообщение grigoreo » 18.03.2009 11:47:12

alexs писал(а):
grigoreo писал(а):Zeos держит анси кодировки, и естественно серверу я говорю чтобы он перекодил в 1251

Вот это лишнее - при подключении укажите кодировку UTF8
в птице именно так.


ладно чую с Zeos + PostgreSQL(UTF8)+Lazarus пока не судьба буду пока юзать стандартный TPConnect, может попозже на свежую голову еще попробую
Аватара пользователя
grigoreo
постоялец
 
Сообщения: 195
Зарегистрирован: 10.03.2009 15:43:43
Откуда: С нашей Раши

Re: вопрос по PostgreSQL

Сообщение Logo » 18.03.2009 12:12:30

В каталоге Free Pascal ~fpc-2.2.x/packages/fcl-db/src/sqldb/postgres замените файл pqconnection.pp на прикрепленный и перекомпиллируйте.
pqconnection.tar


Это просто костыль, позволяющий работать с UTF-8 с двухбайтовой кодировкой. Работает все корректно, но если на сервере сменить кодировку, то будет нецелесообразное расходование памяти. Суть в том, что для чтения данных, буфер памяти удваивается. Правильно будет делать проверку дины данных в байтах, но это позже будет сделано, а пока для кириллицы с UTF-8 все нормально.

Изменения затрагивают функцию:
function TPQConnection.TranslateFldType
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: вопрос по PostgreSQL

Сообщение Climber » 19.03.2009 14:22:28

ладно чую с Zeos + PostgreSQL(UTF8)+Lazarus пока не судьба

В такой конфигурации все должно работать вообще без дополнительных действий...
У меня были проблемы с кодировками в Zeos 6.6.3, в 6.6.2 их не было. 6.6.4 не тестировал. Если база не utf, попробуйте выполнить это:
Код: Выделить всё
ZQuery1.SQL.Text:='set client_encoding = utf8';
ZQuery1.Execute;
сразу после того, как будет установлено соединение.

Не годится! Я в коде работаю с названиями полей, а постоянно переключать раскладку при написании кода меня сильно напрягает.

Вы делаете так?
Код: Выделить всё
var
  MyDBField: string;
begin
  MyDBField:="Это первый столбец в таблице";
  ...
Это моветон, замените на:
Код: Выделить всё
const
  MyDBField="Это первый столбец в таблице";
var
  field1: string;
begin
  field1:=MyDBField;
  ...
А еще используйте Punto Switcher :wink:
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: вопрос по PostgreSQL

Сообщение Logo » 19.03.2009 15:06:22

Ребята, в Postgres своя особенность с UTF. Дело в том, что длину строки мы получаем в символах и буфер выделяется по количеству символов!!! Я не знаю как сейчас дела с Zeos, но в конце 2008г. там была эта проблема. В TPQConnection это временно решили простым удвоением буфера (смотрите выше прикрепленный файл). Сейчас ищут оптимальное решение для этой проблемы в TPQConnection, чтобы выложить нормальный патч, так-как выкладывать файл, где в однобайтовой кодировке будет потреблять в два раза больше памяти, в четырехбайтной проблема так и останется, нет смысла. Но для UTF кириллицы, это нормальное решение.
Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 248

Рейтинг@Mail.ru