Отображение полей с русским текстом при запросе c Oracle

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

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

salog
новенький
Сообщения: 15
Зарегистрирован: 19.11.2008 04:35:07

Отображение полей с русским текстом при запросе c Oracle

Сообщение salog »

Я совершенно новичок в Lazarus. Неделю назад скачал с сайта их последнюю версию (0.9.26).
Так вот - все прекрасно, сходство с Дельфи очень вдохновляет, программы работают быстро, разрабатывать изумительно просто. Мелкие недочеты - совершенно не мешают работать.

Теперь дошел до работы с БД. Успешно присоединился к Oracle, попробовал простые select-ы - работает.
Пока наконец не заметил такой вот... такую вот особенность: если в Oracle поле содержит русский текст, то в DBGrid-е оно хотя и есть (заголовок), но содержимое совершенно пусто (смотри вложение).

Что делать? Кодировка на Oracle - WIN-1251
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Отображение полей с русским текстом при запросе c Oracl

Сообщение Vadim »

salog
А Вы через какой компонент Вы подключаетесь? Нужно в свойствах соеденения выставить кодировку - 1251.
salog
новенький
Сообщения: 15
Зарегистрирован: 19.11.2008 04:35:07

Re: Отображение полей с русским текстом при запросе c Oracl

Сообщение salog »

Через OracleConnection.
Я там вижу свойство CharSet... Это оно?
Или это делать через свойство Params?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Отображение полей с русским текстом при запросе c Oracl

Сообщение Vadim »

Да, через свойство CharSet.
salog
новенький
Сообщения: 15
Зарегистрирован: 19.11.2008 04:35:07

Re: Отображение полей с русским текстом при запросе c Oracl

Сообщение salog »

А что писать? Попробовал WIN1251, 1251, RUSSIAN_CHARSET, RUSSIAN_CIS.CL8MSWIN1251... Без успеха...
А лучше всего подскажите где почитать про компонент OracleConnection и какие значения может принимать CharSet?
Видимо, нужно указывать словосочетание узнаваемое Lazarus-ом...
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Отображение полей с русским текстом при запросе c Oracl

Сообщение Vadim »

А попробуйте поставить UTF-8 или UTF8...
salog
новенький
Сообщения: 15
Зарегистрирован: 19.11.2008 04:35:07

Re: Отображение полей с русским текстом при запросе c Oracl

Сообщение salog »

Что-то не то. Я так понимаю UTF8 (Юникод) - он по умолчанию стоит в последних версиях Lazarus-а.
Надо заставить его переводить входящий поток в Win1251 в UTF... :-(
GrayEddy
постоялец
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Re: Отображение полей с русским текстом при запросе c Oracl

Сообщение GrayEddy »

1. В TSQLQuery редактируете поля (правой кнопкой мыши вызываете контекстное меню, выбираете первый пункт).
2. Для текстовых полей смотрите метод GetText (получить текст) и переопределяете его.

Код: Выделить всё

procedure TDM.qAutoTypeTYPE_NAMEGetText (Sender: TField; var aText: string;
  DisplayText: Boolean );
begin
  aText := AnsiToUtf8(Sender.AsString);
 end;
salog
новенький
Сообщения: 15
Зарегистрирован: 19.11.2008 04:35:07

Re: Отображение полей с русским текстом при запросе c Oracl

Сообщение salog »

Однако....
Тогда уже лучше определить новый тип - какой нибудь SQLQueryAnsi и там все это переопределить.

Я читал про компоненты Zeos. Никто не в курсе - там эта проблема решена (ну типа может свойство какое то есть)?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Re: Отображение полей с русским текстом при запросе c Oracl

Сообщение Mr.Smart »

salog писал(а):Однако....
Тогда уже лучше определить новый тип - какой нибудь SQLQueryAnsi и там все это переопределить.

Я читал про компоненты Zeos. Никто не в курсе - там эта проблема решена (ну типа может свойство какое то есть)?

На сколько знаю нет.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Отображение полей с русским текстом при запросе c Oracl

Сообщение v-t-l »

Не знаю, как с Oracle, а с другими работает

Код: Выделить всё

ZConnection1.Properties.Add('codepage=UTF8'); 

Значение codepage нужно подбирать.
GrayEddy
постоялец
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Re: Отображение полей с русским текстом при запросе c Oracl

Сообщение GrayEddy »

salog писал(а):Однако....
Тогда уже лучше определить новый тип - какой нибудь SQLQueryAnsi и там все это переопределить.


viewtopic.php?f=5&t=3743
Посмотрите сообщения от SAK
salog
новенький
Сообщения: 15
Зарегистрирован: 19.11.2008 04:35:07

Re: Отображение полей с русским текстом при запросе c Oracl

Сообщение salog »

GrayEddy писал(а):1. В TSQLQuery редактируете поля (правой кнопкой мыши вызываете контекстное меню, выбираете первый пункт).
2. Для текстовых полей смотрите метод GetText (получить текст) и переопределяете его.

Код: Выделить всё

procedure TDM.qAutoTypeTYPE_NAMEGetText (Sender: TField; var aText: string;
  DisplayText: Boolean );
begin
  aText := AnsiToUtf8(Sender.AsString);
 end;


Даже и так попробовал, не получилось. А при отладке выяснилось: aText сразу имеет пустое значение! Так что и конвертировать нечего!
Балина... вот беда то... будем ждать 28 версии что ли...
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Отображение полей с русским текстом при запросе c Oracl

Сообщение Vadim »

Проверьте, какое значение Вы получаете в текстовом поле Query. Тоже пустое?
salog
новенький
Сообщения: 15
Зарегистрирован: 19.11.2008 04:35:07

Re: Отображение полей с русским текстом при запросе c Oracl

Сообщение salog »

Проверил вот так:

Код: Выделить всё

  SQLQuery1.Open;
  Edit2.Text := AnsiToUtf8(SQLQuery1.FieldByName('nm_u').AsString);

..и ..оно.. ЗАРАБОТАЛО!!!... Но это на уровне отдельного Edit...

А вот хоть в таком варианте:

Код: Выделить всё

procedure TForm2.StringField1GetText(Sender: TField; var aText: string; DisplayText: Boolean);
var s: string;
begin
  s:= Sender.AsString;
  aText := AnsiToUtf8(s);
end;

или в таком:

Код: Выделить всё

procedure TForm2.StringField1GetText(Sender: TField; var aText: string; DisplayText: Boolean);
var s: string;
begin
  aText := AnsiToUtf8(aText);
end;
...поле в DBGrid остается пустым.

Значит собака где то глубже порылась... Тобишь - где то глубоко в DataSet...
Знать бы где!
Ответить