вопрос по PostgreSQL
Модератор: Модераторы
вопрос по PostgreSQL
Незнаю это глобально или нет, но столкнулся на примере с постгрэ ,
во первых как у компонента TPQConnection при выполнении метода TPQConnection.Open узнать активировалось соединение или нет,помнится в Делфи можно было определить событие AfterConnect, но тут при попытке его сгенерить в листинге оно появляется,а вот в как в инспекторе объекта оно не привязывается даже явно ручками, в итоге проблемка обработать неудачный конект к базе
и второе, тоже в сравнении с делфями, использовал компоненты Zeos при работе с ними насколько я помню у меня после завершения селектов блокировки с представлений в постгрэ снимались после запроса, а теперь при использовании лазарусных компонентов, пока конект в принципе активен висят блокировки на все таблицы и ресурсы каторые я хоть раз задействовал, как это можно обойти, получается я немогу делать изменения в базе пока какието сесии активны
(юзал бы Zeos тем более что есть компоненты для лазаря, но уткнулся в проблему отображения руских букв в DBGrid, рисуются вопросики, пробовал серверу говорить какую кодировку выдавать клиенту принудительно все равно Zeos работает с ansi а DBGrid хочет руские буквы в юникоде, каждый раз ловить событие OnDrawColumnCell и делать перекодировку тоже муторно, все равно рисуется кривовато)
во первых как у компонента TPQConnection при выполнении метода TPQConnection.Open узнать активировалось соединение или нет,помнится в Делфи можно было определить событие AfterConnect, но тут при попытке его сгенерить в листинге оно появляется,а вот в как в инспекторе объекта оно не привязывается даже явно ручками, в итоге проблемка обработать неудачный конект к базе
и второе, тоже в сравнении с делфями, использовал компоненты Zeos при работе с ними насколько я помню у меня после завершения селектов блокировки с представлений в постгрэ снимались после запроса, а теперь при использовании лазарусных компонентов, пока конект в принципе активен висят блокировки на все таблицы и ресурсы каторые я хоть раз задействовал, как это можно обойти, получается я немогу делать изменения в базе пока какието сесии активны
(юзал бы Zeos тем более что есть компоненты для лазаря, но уткнулся в проблему отображения руских букв в DBGrid, рисуются вопросики, пробовал серверу говорить какую кодировку выдавать клиенту принудительно все равно Zeos работает с ansi а DBGrid хочет руские буквы в юникоде, каждый раз ловить событие OnDrawColumnCell и делать перекодировку тоже муторно, все равно рисуется кривовато)
Re: вопрос по PostgreSQL
grigoreo писал(а):...событие AfterConnect, но тут при попытке его сгенерить в листинге оно появляется,а вот в как в инспекторе объекта оно не привязывается даже явно ручками, в итоге проблемка обработать неудачный конект к базе
Есть на данный момент такая проблема. Вы можете выйти с положения прописав вручную присвоение:
Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
begin
PQConnection1.AfterConnect := @PQConnection1AfterConnect;
end;
по Zeos, к сожалению, ничего подсказать не могу.
Re: вопрос по PostgreSQL
Logo
Спасибо такой вариант присвоения сработал на ура
Спасибо такой вариант присвоения сработал на ура
Re: вопрос по PostgreSQL
Вообще-то Zeos'у по барабану с какой кодировкой работать. Вот я, к примеру, задал кодировку UTF-8 своей базе и работаю без малейших проблем. Если кодировка базы отличается от кодировки вывода на экран, то надо пользоваться возможностями сервера БД по автоматической перекодировке. К примеру FireBird и MySQL перекодировку делают. Про Postgre не знаю, никогда с ней не работал.
Re: вопрос по PostgreSQL
Vadim писал(а):Вообще-то Zeos'у по барабану с какой кодировкой работать. Вот я, к примеру, задал кодировку UTF-8 своей базе и работаю без малейших проблем. Если кодировка базы отличается от кодировки вывода на экран, то надо пользоваться возможностями сервера БД по автоматической перекодировке. К примеру FireBird и MySQL перекодировку делают. Про Postgre не знаю, никогда с ней не работал.
Ну скорее всего ты меня не так понял, или я не так, но если можешь поправь, как я понял ситуация такая, сама база у меня в UTF8, я так понял Zeos держит анси кодировки, и естественно серверу я говорю чтобы он перекодил в 1251 , а вот дальше сам лазарь держит UTF8 и то что пришло в Зеос чтобы отобразилось в DBGrid -е Лазаря надо перекодировать в UTF8 ?,но это проблемно
Re: вопрос по PostgreSQL
grigoreo писал(а):...Zeos держит анси кодировки...
Вот это вот поясните подробно - непонятно.
Ещё раз. У меня база в UTF-8 и я ничего никуда не перекодирую. Работаю с базой посредством Zeos.
Re: вопрос по PostgreSQL
Vadim писал(а):grigoreo писал(а):...Zeos держит анси кодировки...
Вот это вот поясните подробно - непонятно.
Ещё раз. У меня база в UTF-8 и я ничего никуда не перекодирую. Работаю с базой посредством Zeos.
А можете для примера выложить выдержки по созданию пустой болванки на Лазарусе для отображения таблички из СУБД и какие свойства контролов инициализируете, чтобы табличка из руских букв показывалась читабельно как в содержимом ячеек так и в названиях полей если они тоже состоят из руских букв, т.е я так понимаю только конект и квери будут взяты из Зеос остальное из стандартных средств Лазаря...
Re: вопрос по PostgreSQL
Хм... Чем дальше, тем страньше... 
TZConnection - там описываются свойства соединения с БД:
- имя сервера БД
- тип сервера БД (выбирается из списка)
- логин
- пароль
- название БД
TZQuery:
- Connection - TZConnection
- SQL - 'SELECT названия, полей FROM таблица WHERE условие выборки ORDER BY поле_сортировки'
TDatasource:
- DataSet - TZQuery
TDBGrid
- DataSource - TDatasource
- а вот название и расположение колонок я прописываю вручную, т.к. имена полей у меня на латинице, а я хочу видеть русские названия.
-------------
Это всё. Данные отображаются на русском языке
TZConnection - там описываются свойства соединения с БД:
- имя сервера БД
- тип сервера БД (выбирается из списка)
- логин
- пароль
- название БД
TZQuery:
- Connection - TZConnection
- SQL - 'SELECT названия, полей FROM таблица WHERE условие выборки ORDER BY поле_сортировки'
TDatasource:
- DataSet - TZQuery
TDBGrid
- DataSource - TDatasource
- а вот название и расположение колонок я прописываю вручную, т.к. имена полей у меня на латинице, а я хочу видеть русские названия.
-------------
Это всё. Данные отображаются на русском языке
Re: вопрос по PostgreSQL
Vadim писал(а):Хм... Чем дальше, тем страньше...
TZConnection - там описываются свойства соединения с БД:
- имя сервера БД
- тип сервера БД (выбирается из списка)
- логин
- пароль
- название БД
TZQuery:
- Connection - TZConnection
- SQL - 'SELECT названия, полей FROM таблица WHERE условие выборки ORDER BY поле_сортировки'
TDatasource:
- DataSet - TZQuery
TDBGrid
- DataSource - TDatasource
- а вот название и расположение колонок я прописываю вручную, т.к. имена полей у меня на латинице, а я хочу видеть русские названия.
-------------
Это всё. Данные отображаются на русском языке
Ну почему странее , вот и я не пойму в делфи все работала перешел на лазаря не отображается,(если только принудительно не кодировать из asci в UTF8)
по поводу ручками названия прописывать так для этого давно представления придуманы, основную таблицу в енглише планируем а в хранимом представлении делаем через AS руские названия,
По идее должны руские буквы видется если база в UTF8 то без перекодировки т.к Лазарус ее по умолчанию тащит, или все таки раз вы на жарптице может с ней то как раз все ок, а дело в клиенте Postgre, и его взаимосвязи с компонентами Zeos
Re: вопрос по PostgreSQL
grigoreo писал(а):сли только принудительно не кодировать из asci в UTF8
Так у Вас БД в кодировке ASCI?
grigoreo писал(а):по поводу ручками названия прописывать так для этого давно представления придуманы, основную таблицу в енглише планируем а в хранимом представлении делаем через AS руские названия
Не годится! Я в коде работаю с названиями полей, а постоянно переключать раскладку при написании кода меня сильно напрягает. Я уж лучше по старинке - с латинскими названиями полей.
grigoreo писал(а):а дело в клиенте Postgre
Не исключено. Хотя и маловероятно. Клиентской DLL'ке тоже абсолютно по барабану кодировка. Она обязана обратится к серверу и выдать на гора полученные сведения. Если бы клиентские DLL'ки у серверов БД работали только в одной определённой кодировке - грош цена таким СУБД.
Ещё раз могу заверить, с чем лично я работал - SQLite, MySQL, FireBird - базы в кодировке UTF-8, отображение русских букв идёт без малейших претензиев.
Добавлено спустя 1 минуту 9 секунд:
А версия ZEOS какая?
Добавлено спустя 1 минуту 42 секунды:
Вы клиентскую DLL'ку используете ту, что шла в комплекте с Вашей СУБД?
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Re: вопрос по PostgreSQL
grigoreo писал(а):Zeos держит анси кодировки, и естественно серверу я говорю чтобы он перекодил в 1251
Вот это лишнее - при подключении укажите кодировку UTF8
в птице именно так.
Re: вопрос по PostgreSQL
alexs писал(а):grigoreo писал(а):Zeos держит анси кодировки, и естественно серверу я говорю чтобы он перекодил в 1251
Вот это лишнее - при подключении укажите кодировку UTF8
в птице именно так.
ладно чую с Zeos + PostgreSQL(UTF8)+Lazarus пока не судьба буду пока юзать стандартный TPConnect, может попозже на свежую голову еще попробую
Re: вопрос по PostgreSQL
В каталоге Free Pascal ~fpc-2.2.x/packages/fcl-db/src/sqldb/postgres замените файл pqconnection.pp на прикрепленный и перекомпиллируйте.
Это просто костыль, позволяющий работать с UTF-8 с двухбайтовой кодировкой. Работает все корректно, но если на сервере сменить кодировку, то будет нецелесообразное расходование памяти. Суть в том, что для чтения данных, буфер памяти удваивается. Правильно будет делать проверку дины данных в байтах, но это позже будет сделано, а пока для кириллицы с UTF-8 все нормально.
Изменения затрагивают функцию:
function TPQConnection.TranslateFldType
Это просто костыль, позволяющий работать с UTF-8 с двухбайтовой кодировкой. Работает все корректно, но если на сервере сменить кодировку, то будет нецелесообразное расходование памяти. Суть в том, что для чтения данных, буфер памяти удваивается. Правильно будет делать проверку дины данных в байтах, но это позже будет сделано, а пока для кириллицы с UTF-8 все нормально.
Изменения затрагивают функцию:
function TPQConnection.TranslateFldType
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Re: вопрос по PostgreSQL
ладно чую с 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;
...
Re: вопрос по PostgreSQL
Ребята, в Postgres своя особенность с UTF. Дело в том, что длину строки мы получаем в символах и буфер выделяется по количеству символов!!! Я не знаю как сейчас дела с Zeos, но в конце 2008г. там была эта проблема. В TPQConnection это временно решили простым удвоением буфера (смотрите выше прикрепленный файл). Сейчас ищут оптимальное решение для этой проблемы в TPQConnection, чтобы выложить нормальный патч, так-как выкладывать файл, где в однобайтовой кодировке будет потреблять в два раза больше памяти, в четырехбайтной проблема так и останется, нет смысла. Но для UTF кириллицы, это нормальное решение.
