Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не читаются unicode данные


gog ©   (2010-03-24 18:17:00) 

Господа посоветуйте что делать?
Использую Дельфи 2010. База Oracle. Текстовые данные хранятся в unicod-е в национальном языке.
Соединение через AdoConnection. Вот строка соединения:

Provider=MSDAORA.1;Password=***;User ID=***;Data Source=dbname;Extended Properties="Unicode=True"

(вместо *** и dbName прописаны реальные значения)

а вот фрагмент программы

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 S1: UnicodeString;
 ft: TFieldType;
begin
 Edit1.Text:= ADOConnection1.ConnectionString;
 with qryWork do begin
   Close;
   SQL.Clear;
   SQL.Add('SELECT Term');
   SQL.Add('  FROM MyTable');
   SQL.Add(' WHERE ...');
   Open;
   ft:= qryWork.FieldByName('Term').DataType;

   Edit2.Text:= IntToStr((Ord(ft)));
   s1:= FieldByName('Term').Value;
   Edit3.Text:= S1;
//    Edit3.Text:= FieldByName('Term').Value;
//    Edit3.Text:= Recordset.GetString(2, 1, #9, #13#0, '<NULL>');
 end;
end;

Получаю одни вопросителные знаки и DataType = ftString а не ftWideString


Кщд   (2010-03-26 11:36:00) [1]

>Правильный$Вася   (26.03.10 11:11) [11]
при кодировке базы AL32UTF8?
изменяет


Правильный$Вася   (2010-03-26 11:11:00) [2]


> Тип поля varchar(2)

если мне не изменяет память, NVARCHAR надо


Игорь Шевченко   (2010-03-26 10:54:00) [3]

gog ©   (26.03.10 09:04) [9]

Понятно, база у тебя в unicode, а вот клиент в какой кодировке воспринимает ?
к тому ли ты Oracle_home подключаешься из Delphi, у которого NLS_LANG юникодный указан ?


gog   (2010-03-26 09:04:00) [4]

Тип поля varchar(2)

NLS_LANG для таблиц на сервере AMERICAN_AMERICA.AL32UTF8

в реестре для NLS_LANG в разных ключах прописаны разные значения, в том числе и указанное выше.
Запрос  SELECT userenv ('language') from DUAL как с PL/SQL Developer, так из Дельфи выдает  AMERICAN_AMERICA.AL32UTF8

Запрос select parameter,substr(value,1,30) from nls_database_parameters where parameter like 'NLS%' дал следующее:

PARAMETER                          SUBSTR(VALUE,1,30)
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_LANGUAGE                         AMERICAN
NLS_TERRITORY                         AMERICA
NLS_CURRENCY                         $
NLS_ISO_CURRENCY                 AMERICA
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET                 AL32UTF8
NLS_CALENDAR                         GREGORIAN
NLS_DATE_FORMAT                 DD-MON-RR
NLS_DATE_LANGUAGE                 AMERICAN
NLS_SORT                                 BINARY
NLS_TIME_FORMAT                 HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT         DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT                 HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY                 $
NLS_COMP                                 BINARY
NLS_LENGTH_SEMANTICS         BYTE
NLS_NCHAR_CONV_EXCP         FALSE
NLS_RDBMS_VERSION                10.2.0.4.0

Из PL/SQL Developer все работает правильно, Дельфи не хочет никак


Игорь Шевченко   (2010-03-25 20:16:00) [5]

gog ©   (25.03.10 15:31) [7]

Что написано в реестре для NLS_LANG и какого типа поля ты пытаешься выбрать в запросе ?

ну и заодно, что выдает

select parameter,substr(value,1,30) from nls_database_parameters where parameter like 'NLS%';


gog   (2010-03-25 15:31:00) [6]

Можно ли поменять значение NLS_LANG из делфи?

Alter session set NLS_LANG=AMERICAN_AMERICA.AL32UTF8

выдает ошибку как из Дельфи так и из Pl/Sql Developer. По тому менял в реестре, но там прописан во многих местах и не уверен что поменял там где надо (менял по одному запускал программу и воостанавливал старое значение). Менять сразу везде побоялся, не поставить систему верх ногами.


gog   (2010-03-25 14:42:00) [7]

Поменял значение NLS_LANG в реестре на ту, что указано для Оракловской таблицы. Теперь вместо вопросительных знаков выдается длинная последовательность символов, похожие на знак интеграла чередующие с буквами а и е из французского алфавита


Правильный$Вася   (2010-03-25 13:18:00) [8]


> ты не указал здесьтип поля

читать умеешь?


gog   (2010-03-25 13:12:00) [9]


> это значит, что ты не указал здесь тип поля и значение сессионной
> переменной оракла, а без них дальше ничего не насоветуешь


Их надо указать в строке соединения?
Если да то какой формат?


Правильный$Вася   (2010-03-25 13:01:00) [10]


> Указал рекомендуемый Вами провайдер но получил сообщение"Provider
> cannot be found. It may not be properly installed"

ставится с клиентом оракла

> что значит "Тип поля в таблице и значение NLS_LANG в студию"

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


gog   (2010-03-25 08:45:00) [11]

Г-н Игор Шевченко

Указал рекомендуемый Вами провайдер но получил сообщение
"Provider cannot be found. It may not be properly installed"

Поясните пожалуиста как он инстолируется и что значит "Тип поля в таблице и значение NLS_LANG в студию"


Игорь Шевченко   (2010-03-24 19:14:00) [12]

Тип поля в таблице и значение NLS_LANG в студию

D2010 прекрасно работает в с юникодом в Oracle через ADO

 object db: TADOConnection
   Connected = True
   ConnectionString =
     'Provider=OraOLEDB.Oracle.1;Password=***;Persist Security Info=Tr' +
     'ue;User ID=***;Data Source=***'
   Provider = 'OraOLEDB.Oracle.1'
   Left = 16
   Top = 16
 end


Наверх

Титульная страница Поиск, карта сайта Написать письмо