[Решено] TIBSQL - непонятки с именами полей.

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

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

[Решено] TIBSQL - непонятки с именами полей.

Сообщение slyubez » 31.03.2015 09:53:27

Здравствуйте, *Rik*. Огромное спасибо за Вашу работу над компонентами.

Нашел такую проблему. Работаю с компонентом TIBSQL под Windows, цепляюсь к базе в кодировке UTF8. Выполняю SELECT-запрос, у которого прописаны русские алиасы полей в кавычках после AS. Затем вычитываю имена этих полей через Fields [x].Name. Получается белиберда - первые символы отображаются черте как.

Прилагаю тестовый проект. У него в качестве клиентской библиотеки забита fbembed.dll. Программа создает простейшую базу в каталоге приложения, заполняет табличку одной строкой и пытается ее вычитать.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось slyubez 19.07.2015 13:22:07, всего редактировалось 1 раз.
slyubez
постоялец
 
Сообщения: 180
Зарегистрирован: 31.03.2015 08:44:07

Re: TIBSQL - непонятки с именами полей.

Сообщение *Rik* » 31.03.2015 11:27:17

В IBUtil глючит функция FormatIdentifierValue, она пытается с именами полей как с Ansi работать, хотя имена приходят в UTF8, попробую исправить. Как исправлю отпишусь...
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: TIBSQL - непонятки с именами полей.

Сообщение slyubez » 31.03.2015 11:41:43

Спасибо заранее.
slyubez
постоялец
 
Сообщения: 180
Зарегистрирован: 31.03.2015 08:44:07

Re: TIBSQL - непонятки с именами полей.

Сообщение *Rik* » 31.03.2015 13:08:07

slyubez
Исправил.
http://visual-t.ru/download.html
или прямая ссылка:
http://visual-t.ru/files/components.7z
В архиве 3 пакета компонент, если нужны только ibx, извлеките только их.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: TIBSQL - непонятки с именами полей.

Сообщение slyubez » 31.03.2015 13:16:56

Благодарю. Попробую.

Добавлено спустя 20 минут 34 секунды:
Попробовал. Проверил на рабочем проекте. Теперь эти алиасы почему-то отображаются в ВЕРХНЕМ регистре и впридачу обрезаются в длине до 16 символов. Это точно не ограничение Firebird - в FIB+ с Delphi такого поведения не отмечал. С IBX на Delphi не работал уже очень давно и не касался алиасов полей, тем более у меня сейчас D2010 с непиленными под UTF8 компонентами IBX.
slyubez
постоялец
 
Сообщения: 180
Зарегистрирован: 31.03.2015 08:44:07

Re: TIBSQL - непонятки с именами полей.

Сообщение *Rik* » 31.03.2015 16:53:40

slyubez писал(а):Проверил на рабочем проекте. Теперь эти алиасы почему-то отображаются в ВЕРХНЕМ регистре и впридачу обрезаются в длине до 16 символов. Это точно не ограничение Firebird - в FIB+ с Delphi такого поведения не отмечал. С IBX на Delphi не работал уже очень давно и не касался алиасов полей, тем более у меня сейчас D2010 с непиленными под UTF8 компонентами IBX.


Для передачи информации к серверу и обратно, компоненты манипулируют записью TXSQLVAR (объявлена в IBHeader) через клиентскую библиотеку fbclient.* или fbembed.dll.
Код: Выделить всё
TXSQLVAR = record
    sqltype                     : Short;     (** datatype of field **)
    sqlscale                    : Short;     (** scale factor **)
    sqlsubtype                  : Short;     (** datatype subtype - BLOBs **)
                    (** & text types only **)
    sqllen                      : Short;     (** length of data area **)
    sqldata                     : PChar;     (** address of data **)
    sqlind                      : PShort;    (** address of indicator **)
                                             (** variable **)
    sqlname_length              : Short;     (** length of sqlname field **)
    (** name of field, name length + space for NULL **)
    sqlname                     : array[0..31] of Char;
    relname_length              : Short;     (** length of relation name **)
    (** field's relation name + space for NULL **)
    relname                     : array[0..31] of Char;
    ownname_length              : Short;     (** length of owner name **)
    (** relation's owner name + space for NULL **)
    ownname                     : array[0..31] of Char;
    aliasname_length            : Short;     (** length of alias name **)
    (** relation's alias name + space for NULL **)
    aliasname                   : array[0..31] of Char;
  end;  // TXSQLVAR 

Как видно размер полей для передачи имен ограничен [0..31], а т.к. русские символы занимают в UTF8 - 2 байта, то соответственно русский алиас обрежется вдвое от указанной длины, заполнение структуры происходит на сервере, поэтому русские алиасы, для UTF-8 на клиенте, уже с сервера приходят обрезанными. На данный момент найти какую-то альтернативу решения проблемы довольно проблематично, поэтому могу только рекомендовать не использовать русские алиасы..
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: TIBSQL - непонятки с именами полей.

Сообщение slyubez » 31.03.2015 21:09:15

Спасибо за инфу и за внимание к проблеме. Вспомнил, что в Delphi я работаю через ANSI, и там можно задавать больше символов именно за счет этой кодировки. Буду думать об иных путях задания заголовков полей.
slyubez
постоялец
 
Сообщения: 180
Зарегистрирован: 31.03.2015 08:44:07


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru