Lazarus+ZEOS+Postgres

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

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

Lazarus+ZEOS+Postgres

Сообщение yuray » 10.07.2009 00:05:43

Очень интересно услышать о связке Lazarus+ZEOS+PostgreSQL. Сам всегда работал с Lazarus+UIB+TFBDataset от alexs (редко TIBConnection)+Firebird. Но для нового проекта решили использовать в качестве СУБД Postgres Plus Advanced Server 8.3R2. Вот сижу и смотрю на нового для себя зверя. Работаю c RHEL Client, lazarus 0.9.27 r17945, fpc 2.2.3, gtk2, ZEOS 6.6.5-stable. Первые впечатления очень даже неплохие. Есть первые вопросы, глюки. Так вот.
    1. Какую кодировку выбрать для СУБД? В птице всегда использовал cp1251. Проблем с win32, gtk1, gtk2 не было. Но когда создал базу в Postgres в cp1251, то в дбгриде появились знаки вопроса. Пересоздал базу в кодировке utf-8 - все отображается нормально. Какие критерии используют при выборе кодировки для СУБД?
    2. Для вызова хранимой процедуры пишу код
    Код: Выделить всё
      var
        sp: TZStoredProc;
      begin
        sp := TZStoredProc.Create(Self);
        try
          sp.Connection := ZConnection1;
          sp.StoredProcName := 't_abode_type_base_insert';
          sp.Params.CreateParam(ftString,'sname_type', ptInput);
          sp.Params.CreateParam(ftInteger,'nid', ptOutput);
          sp.ParamByName('sname_type').AsString := 'TEST';
          sp.ExecProc;
        finally
          sp.Free;
        end;
      end;
    который падает с ошибкой Unsupported operation. Что не так? Процедура t_abode_type_base_insert работает в Postgres Studio нормально. Работать с компонентом TZStoredProc через инспектор объектов невозможно - при вызове редактора параметров процедуры lazarus закрывается. :(
Буду рад услышать отзывы всех, кто работал с Postgres. А может нужно смотреть в сторону родных TPQConnection+TSQLQuery?
yuray
новенький
 
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Re: Lazarus+ZEOS+Postgres

Сообщение grigoreo » 10.07.2009 08:56:45

yuray писал(а):Какую кодировку выбрать для СУБД? В птице всегда использовал cp1251.


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

yuray писал(а): 2. Для вызова хранимой процедуры пишу код

а чем плох вызов через select?

yuray писал(а): А может нужно смотреть в сторону родных TPQConnection+TSQLQuery?


не говорю что Zeos идеал но долго пинался с TPQConnection и пришел к выводу что из бесплатных другой альтернативы пока нет если конечно ты хочешь юзать что то серьезное от Постгрэ для простых вещей TPQConnection вполне сойдет
Аватара пользователя
grigoreo
постоялец
 
Сообщения: 195
Зарегистрирован: 10.03.2009 15:43:43
Откуда: С нашей Раши

Re: Lazarus+ZEOS+Postgres

Сообщение yuray » 10.07.2009 11:08:19

grigoreo писал(а):а чем плох вызов через select?

А можно пример? Имеем процедуру t_abode_type_base_insert на вставку записи в таблицу з двумя параметрами Input и Output. В Postgres Studio в SQL Editore пишу так
Код: Выделить всё
declare nid numeric(17);
begin
  t_abode_type_base_insert('Тест', nid);
end;

Жму "Execute query" - все работает. Как мне это сделать в лазаре? select не проходит так как это не функция а процедура как бы. А параметр nid хотелось бы вернуть.
yuray
новенький
 
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Re: Lazarus+ZEOS+Postgres

Сообщение grigoreo » 10.07.2009 12:03:35

yuray писал(а):
grigoreo писал(а):а чем плох вызов через select?

А можно пример? Имеем процедуру t_abode_type_base_insert на вставку записи в таблицу з двумя параметрами Input и Output. В Postgres Studio в SQL Editore пишу так
Код: Выделить всё
declare nid numeric(17);
begin
  t_abode_type_base_insert('Тест', nid);
end;

Жму "Execute query" - все работает. Как мне это сделать в лазаре? select не проходит так как это не функция а процедура как бы. А параметр nid хотелось бы вернуть.


1)пример заготовки 'select t_abode_type_base_insert('Тест', nid)' на выходе будет рекорд одним полем то бишь массив элементов через запятую
2)'select * from t_abode_type_base_insert('Тест', nid)' на выходе будет рекорд c разбивкой по полям согласно выходным данным процедуры
Аватара пользователя
grigoreo
постоялец
 
Сообщения: 195
Зарегистрирован: 10.03.2009 15:43:43
Откуда: С нашей Раши

Re: Lazarus+ZEOS+Postgres

Сообщение Climber » 10.07.2009 12:20:39

Я не знаю, что такое Postgres Studio, наверно, что-то типа pgAdmin, только с продвинутым SQL редактором...
Но я знаю SQL (как мне кажется).
Если нужна функция, которая делает insert и возвращает список строк, можно сделать так:
Код: Выделить всё
// объявление функции:
create function myfunc () returns setof record as $$
begin
return query
insert into ... values ... returning <список полей>;
end;
// использование функции:
select * from myfunc() as ff (<список полей>)

Это если TZStoredProc глючит...
Кстати, что за конструкция у вас?
Код: Выделить всё
declare nid numeric(17);
begin
  t_abode_type_base_insert('Тест', nid);
end;

Похоже на кусок объявления функции...
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Lazarus+ZEOS+Postgres

Сообщение yuray » 10.07.2009 13:45:42

Climber писал(а):Я не знаю, что такое Postgres Studio, наверно, что-то типа pgAdmin, только с продвинутым SQL редактором...
Да. "This program is based on PgAdmin III"

Вся проблема в том, что t_abode_type_base_insert - это процедура
Код: Выделить всё
CREATE OR REPLACE PROCEDURE t_abode_type_base_insert(sname_type IN character varying, nid OUT numeric) AS
BEGIN
nID := new_id();
INSERT INTO t_abode_type(
            id, name_type)
    VALUES (nID, sNAME_TYPE);
END

Похоже, что процедуры появились только в Postgres Plus Advanced Server 8.3R2. В обычном PostgreSQL их нет (возможно ошибаюсь, пусть те, кто знает поправит). Буду пытаться работать с функциями.
Думаю, что все навороты Advanced Servera (PL/SQL конструкции, процедури...) связка Lazarus+ZEOS еще не готова поддерживать.

Добавлено спустя 3 часа 11 минут 8 секунд:
Код: Выделить всё
CREATE OR REPLACE FUNCTION f_abode_type_base_insert(sname_type character varying)
  RETURNS numeric AS
$BODY$declare
  nid numeric;
begin
  nID := new_id();
  insert into t_abode_type(id, name_type)
  values (nID, sName_type);
  return nid;
end
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION f_abode_type_base_insert(character varying) OWNER TO enterprisedb;

select к такой функции заработал. :)
yuray
новенький
 
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Re: Lazarus+ZEOS+Postgres

Сообщение Vadim » 11.07.2009 07:34:10

yuray
Работать с компонентом TZStoredProc через инспектор объектов невозможно - при вызове редактора параметров процедуры lazarus закрывается.

А у Вас какая версия ZEOS? 6.6.4 глючила в некоторых местах и именно связанных с вызовом некоторых редакторов. В 6.6.5 вроде всё исправили, по крайней мере у меня все редакторы которые нужно вызываются и работают без проблем. И вроде с вызовом процедур через TZStoredProc всё в порядке, правда я пользовался не Postgre...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Lazarus+ZEOS+Postgres

Сообщение yuray » 12.07.2009 23:40:11

Vadim писал(а):А у Вас какая версия ZEOS?

yuray писал(а):Работаю c RHEL Client, lazarus 0.9.27 r17945, fpc 2.2.3, gtk2, ZEOS 6.6.5-stable.

Возможно lazarus обновить стоит... :?:
yuray
новенький
 
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Re: Lazarus+ZEOS+Postgres

Сообщение SeventhSon » 15.07.2009 15:19:28

первым делом проверь как связка Lazarus+ZEOS+Pg обрарабатывает/отображает NUMERIC(?,?).я пробовал у меня или округлялось число или отбрасывалась дробная часть(точно не помню) потому и отказался от ZEOS
SeventhSon
новенький
 
Сообщения: 56
Зарегистрирован: 17.02.2009 01:57:17

Re: Lazarus+ZEOS+Postgres

Сообщение Climber » 15.07.2009 16:58:02

SeventhSon писал(а):первым делом проверь как связка Lazarus+ZEOS+Pg обрарабатывает/отображает NUMERIC(?,?).я пробовал у меня или округлялось число или отбрасывалась дробная часть(точно не помню) потому и отказался от ZEOS

То есть в базе хранится, например, число "123.00", а на экран выводится "123"? Так это просто решается, через
Код: Выделить всё
FloatToStrF(Value, Format, Precision, Digits))
.
Value - число, Format - константа, указывающая тип (ffNumber, например), Precision - число знаков, Digits - число знаков после запятой.
Может, другие компоненты для доступа и делают это сразу (не уверен), но проблема мелковата, имхо, для того, чтобы отказываться от zeos (тем более что альтернатив не много).
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва


Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28

Рейтинг@Mail.ru