Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 клиент Oracle - Delphi - NLS_LANG  [new]
копосов нв
Guest
Написана программа на Delphi делает запросы к Oracle, в ответ все русские буквы заменяются знаком вопроса. Проблема мне известна в переменной NLS_LANG (HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0) на клиенте Oracle значение CHARACTERSET не согласуется с CHARACTERSET БД на сервере Oracle.
Программа установлена на сетевом ресурсе (файл-сервере) и запускается клиентами в локальной сети. Чтобы решить проблему с кодировкой можно на клиентах (из программы!) установить значение параметра NLS_LANG, например, в AMERICAN_AMERICA.CL8MSWIN1251, но реестр на редактирование закрыт для пользователей - соответственно вариант отлетает!
Можно посылать на сервер, что вроде alter session set ..., но у некоторых юзеров нет на alter прав.
Остаётся вариант на клиенте сделать установку параметра NLS_LANG при каждом сеансе. Вопрос как это сделать?
20 сен 05, 12:08    [1893358]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
Valeo Pupsus
Member

Откуда: Харьков
Сообщений: 140

Нормальный вариант - послать админа настраивать людям клиентов, чтоб они
работать могли, а не вопросики разглядывали.

--
Best regards,
Valeo Pupsus.


Posted via ActualForum NNTP Server 1.3

20 сен 05, 12:23    [1893446]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
копосов нв
Guest
Valeo Pupsus

Нормальный вариант - послать админа настраивать людям клиентов, чтоб они
работать могли, а не вопросики разглядывали.

--
Best regards,
Valeo Pupsus.


Posted via ActualForum NNTP Server 1.3


Вопрос - не людей гонять, а возможно ли программно для конктретного сеанса (внутри сессии) выставить нужное значение параметра NLS_LANG на клиенте.
20 сен 05, 13:29    [1893995]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
Valeo Pupsus
Member

Откуда: Харьков
Сообщений: 140

Если работу свою не делают, то надо гонять, а не костыли выдумывать.См.хелп:

Setting NLS Parameters
NLS parameters determine the locale-specific behavior on both the client and
the server. There are four ways to specify NLS parameters:
- As initialization parameters on the server.
NLS_TERRITORY = "CZECH REPUBLIC"

- As environment variables on the client.
% setenv NLS_SORT FRENCH

- As ALTER SESSION parameters.
SQL> ALTER SESSION SET NLS_SORT = FRENCH;

-As a SQL function parameter.
TO_CHAR(hiredate, 'DD/MON/YYYY', 'nls_date_language = FRENCH')



--
Best regards,
Valeo Pupsus.


Posted via ActualForum NNTP Server 1.3

20 сен 05, 13:40    [1894089]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
копосов нв
Guest
Всё же будет решение как задать схему кодирования символов (кодировку), используемую в клиентском приложении (кодировку терминала пользователя) на лету?
20 сен 05, 13:53    [1894195]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
Orus
Member

Откуда:
Сообщений: 28
попробуй сделать процу от имени пользователя, имеющего соответсвующие права на alter session

procedure SETNLS
is
begin
execute immediate 'ALTER SESSION SET NLS_SORT = FRENCH' ;
end;

и дать права обычным юзерам на execute этой программы
20 сен 05, 14:00    [1894237]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
копосов нв
Guest
Orus
попробуй сделать процу от имени пользователя, имеющего соответсвующие права на alter session

procedure SETNLS
is
begin
execute immediate 'ALTER SESSION SET NLS_SORT = FRENCH' ;
end;

и дать права обычным юзерам на execute этой программы


Почему NLS_SORT?
20 сен 05, 14:19    [1894377]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
копосов нв
Guest
В начале я указал не правильно. Пользователь может изменять окружение сессии, т.е. alter session... .
20 сен 05, 14:25    [1894439]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 3361
копосов нв
Чтобы решить проблему с кодировкой можно на клиентах (из программы!) установить значение параметра NLS_LANG, например, в AMERICAN_AMERICA.CL8MSWIN1251, но реестр на редактирование закрыт для пользователей - соответственно вариант отлетает!


Зачем реестр? Установить переменную окружения. Например можно сделать .BAT файл:

SET NLS_LANG=AMERICAN_CIS.CL8MSWIN1251
MY_PROGRAM.EXE
20 сен 05, 18:00    [1895731]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
Elic
Member

Откуда: 1984. Следующие на оккупацию финно-угром
Сообщений: 23738
Либо установить эту переменную окружения прямо из своей программы.
RTFM SetEnvironmentVariable.
20 сен 05, 18:09    [1895782]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
zirex
Member

Откуда:
Сообщений: 714
копосов нв
Написана программа на Delphi делает запросы к Oracle, в ответ все русские буквы заменяются знаком вопроса. Проблема мне известна в переменной NLS_LANG (HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0) на клиенте Oracle значение CHARACTERSET не согласуется с CHARACTERSET БД на сервере Oracle.
Программа установлена на сетевом ресурсе (файл-сервере) и запускается клиентами в локальной сети. Чтобы решить проблему с кодировкой можно на клиентах (из программы!) установить значение параметра NLS_LANG, например, в AMERICAN_AMERICA.CL8MSWIN1251, но реестр на редактирование закрыт для пользователей - соответственно вариант отлетает!
Можно посылать на сервер, что вроде alter session set ..., но у некоторых юзеров нет на alter прав.
Остаётся вариант на клиенте сделать установку параметра NLS_LANG при каждом сеансе. Вопрос как это сделать?


вы соединяетесь через OCI, а через NET не пробовали (ODAC это умеет)? NET не требует установленного ораклового клиента, т.о. кодировка устанавливается прямо в приложении.
20 сен 05, 18:25    [1895863]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
Biz©
Member

Откуда: Snezhinsk
Сообщений: 5690
копосов нв
Программа установлена на сетевом ресурсе (файл-сервере) и запускается клиентами в локальной сети. Чтобы решить проблему с кодировкой можно на клиентах (из программы!) установить значение параметра NLS_LANG, например, в AMERICAN_AMERICA.CL8MSWIN1251, но реестр на редактирование закрыт для пользователей - соответственно вариант отлетает!

а в ветке HKCU такую же структуру как и в HKLM создавать не пробовали ? при работе эта ветка накладывается сверху на HKLM и ессно замещает одинаковые ключики ...
20 сен 05, 22:21    [1896187]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
копосов нв
Guest
zirex
копосов нв
Написана программа на Delphi делает запросы к Oracle, в ответ все русские буквы заменяются знаком вопроса. Проблема мне известна в переменной NLS_LANG (HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0) на клиенте Oracle значение CHARACTERSET не согласуется с CHARACTERSET БД на сервере Oracle.
Программа установлена на сетевом ресурсе (файл-сервере) и запускается клиентами в локальной сети. Чтобы решить проблему с кодировкой можно на клиентах (из программы!) установить значение параметра NLS_LANG, например, в AMERICAN_AMERICA.CL8MSWIN1251, но реестр на редактирование закрыт для пользователей - соответственно вариант отлетает!
Можно посылать на сервер, что вроде alter session set ..., но у некоторых юзеров нет на alter прав.
Остаётся вариант на клиенте сделать установку параметра NLS_LANG при каждом сеансе. Вопрос как это сделать?


вы соединяетесь через OCI, а через NET не пробовали (ODAC это умеет)? NET не требует установленного ораклового клиента, т.о. кодировка устанавливается прямо в приложении.


Через ADO! Provider=MSDAORA.1;
21 сен 05, 09:17    [1896588]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
копосов нв
Guest
Biz©
копосов нв
Программа установлена на сетевом ресурсе (файл-сервере) и запускается клиентами в локальной сети. Чтобы решить проблему с кодировкой можно на клиентах (из программы!) установить значение параметра NLS_LANG, например, в AMERICAN_AMERICA.CL8MSWIN1251, но реестр на редактирование закрыт для пользователей - соответственно вариант отлетает!

а в ветке HKCU такую же структуру как и в HKLM создавать не пробовали ? при работе эта ветка накладывается сверху на HKLM и ессно замещает одинаковые ключики ...


Реестр трогать нельзя!
21 сен 05, 09:18    [1896591]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
копосов нв
Guest
Elic
Либо установить эту переменную окружения прямо из своей программы.
RTFM SetEnvironmentVariable.


на кнопку получения данных вешаю но ничего не выходит

function SetEnvVarValue(const VarName, VarValue: string): Integer;
begin
  // Просто вызываем API функцию
  if Windows.SetEnvironmentVariable(PChar(VarName), PChar(VarValue)) then
    Result := 0
  else
    Result := GetLastError;
end;

procedure TForm1.SetReceiveAktsClick(Sender: TObject);
var
  tc:Cardinal;
  ErrCode: Integer;
begin

 ErrCode := SetEnvVarValue('NLS_LANG','AMERICAN_AMERICA.CL8MSWIN1251');
 if ErrCode <> 0 then ShowMessage(SysErrorMessage(ErrCode));
...

Может делаю вызов не в том месте...?
21 сен 05, 09:20    [1896599]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
копосов нв
Guest
Попробывал так:
создаю файл start_apl.cmd
в нём:
@echo off
set nls_lang=AMERICAN_AMERICA.CL8MSWIN1251
Cub2005.exe

и тогда всё катит!

Собственно на сервере именно такой файл я писал для DBA:
@echo off
set nls_lang=AMERICAN_AMERICA.CL8MSWIN1251
%oracle_home%\bin\svrmgrl

Всё же можно ли тоже самой сделать в самом приложении?

.
.
.

УРА!!!!!!!!!!!!!!!!!!!!
на создание формы писать надо было!!!!
УРА!!!!!!!!!!!!!!!!!!!!

procedure TForm1.FormCreate(Sender: TObject);
var
 ErrCode: Integer;
begin
 ErrCode := SetEnvVarValue('NLS_LANG','AMERICAN_AMERICA.CL8MSWIN1251');
 if ErrCode <> 0 then ShowMessage(SysErrorMessage(ErrCode));
21 сен 05, 09:39    [1896660]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
Dmitry Arefiev
Member

Откуда: da-soft
Сообщений: 9080
quot копосов нв]Может делаю вызов не в том месте...?[/quot]
1) Установка переменной среды должна происходить перед соединением с сервером. Хотя OCI позволяет устанавливать кодировку данных для отдельных колонок и параметров, начиная с 9.2.
2) Всем, кто советовал ALTER SESSION. OCI переводит часть NLS_LANG (AMERICAN_AMERICA) в длинную ALTER SESSION команду и часть (CL8MSWIN1251) в кодировку данных. Кодировка данных устанавливается для сессии не ALTER SESSION командой, а внутренним OCI вызывом. Так что ALTER SESSION в данном случае не причем.

Удачи,
Дмитрий

--
AnyDAC (www.da-soft.com) - Oracle, MySQL, MSSQL, MSAccess, IBM DB2,
Sybase ASA, DbExpress, ODBC freeware data access framework.
21 сен 05, 10:33    [1896913]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 15178
копосов нв
на клиенте Oracle значение CHARACTERSET не согласуется с CHARACTERSET БД на сервере Oracle.


Что касается методов решения - все вроде бы ясно (в т.ч. и недостатки Вашего - что будете делать, если, например, французы прикупят ваше изделие? =)

Хочется внести ясность только в один вопрос - про "несогласованность значения CHARACTERSET на клиенте с CHARACTERSET БД на сервере Oracle".
Для "согласованности" требуется только одно - возможность преобразования серверного чарсета в клиентский.
В Вашем случае имеет место несогласованность между выбранной клиентской кодировкой и кодировкой шрифтов, которыми Вы отображаете информацию.

Для примера - запуск оконной и консольной версий SQL*Plus (не секрет, что консольная "живет" в 866, оконная - в "1251"):

C:\TEMP\>set nls_lang=AMERICAN_CIS.CL8MSWIN1251
C:\TEMP\>sqlplusw 
открылось окошко:
SQL*Plus: Release 8.1.7.0.0 - Production on Wed Sep 21 21:44:57 2005
(c) Copyright 2000 Oracle Corporation.  All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.6.0 - Production

SQL> select 'Вася' from dual;

'ВАС'
----
Вася

SQL> quit

Сменим кодировку:
C:\TEMP\>set nls_lang=AMERICAN_CIS.RU8PC866
C:\TEMP\>sqlplusw 
окошко:
SQL*Plus: Release 8.1.7.0.0 - Production on Wed Sep 21 21:48:19 2005
(c) Copyright 2000 Oracle Corporation.  All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.6.0 - Production

SQL> select 'Вася' from dual;

[b]'Вђр'[/b]
----
Вася

SQL>quit

Зато работает консольная версия:
C:\TEMP\>sqlplus
SQL*Plus: Release 8.1.7.0.0 - Production on Wed Sep 21 21:50:07 2005
(c) Copyright 2000 Oracle Corporation.  All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
With the Partitioning option
JServer Release 9.2.0.6.0 - Production

SQL> select 'Вася' from dual;

'ВАС'
----
Вася

SQL>quit
Обратите внимание - ни слова о database charset!
21 сен 05, 21:59    [1899975]     Ответить | Цитировать Сообщить модератору
 Re: клиент Oracle - Delphi - NLS_LANG  [new]
копосов нв
Guest
ок. согласен.
22 сен 05, 12:01    [1901041]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить
 
Лучший учебный центр Microsoft!
Новейшие курсы Microsoft SQL Server 2014!
Статус Academy Oracle. Очень привлекательные цены на курсы Oracle!
Курсы MySQL. Много групп в сентябре!