Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51767
Лично у меня не получается :(
// ДОА, Делфи-7
SetEnvironmentVariable('nls_lang', '_.WE8ISO8859P1'); // эту базу нам надо прочитать, она не наша
try
  OracleSession1.Connected := true;
  OracleDataSet1.Open;
finally
  SetEnvironmentVariable('nls_lang', '_.CL8MSWIN1251');
end;

//OracleSession1.Connected := false;

OracleSession2.Connected := true; // открывается как WE8ISO8859P1, а надо CL8MSWIN1251
OracleDataSet2.Open;
А если перед открытием OracleSession2 закрыть OracleSession1, то все нормально.

Это вообще возможно - работать с двумя сессиями в разных кодировках?
30 июл 08, 14:09    [6004646]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
оадев
Guest
а алтер сешн сделать?
30 июл 08, 14:16    [6004690]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51767
оадев
а алтер сешн сделать?
у меня вышел фигвам
30 июл 08, 14:21    [6004729]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
_varvar_
Member

Откуда:
Сообщений: 155
а так?
// ДОА, Делфи-7
SetEnvironmentVariable('nls_lang', '_.WE8ISO8859P1'); // эту базу нам надо прочитать, она не наша
try
  OracleSession1.Connected := true;
  OracleDataSet1.Open;
finally
  SetEnvironmentVariable('nls_lang', EmptyStr);
  SetEnvironmentVariable('nls_lang', '_.CL8MSWIN1251');
end;

//OracleSession1.Connected := false;

OracleSession2.Connected := true; // открывается как WE8ISO8859P1, а надо CL8MSWIN1251
OracleDataSet2.Open;
30 июл 08, 14:27    [6004772]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51767
_varvar_
а так?
Не, тот же фигвам
30 июл 08, 14:28    [6004781]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
есть NLS коннекта-сессии, а есть БД
30 июл 08, 14:43    [6004904]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51767
Petro123
есть NLS коннекта-сессии, а есть БД
Ну а двух сессий?
30 июл 08, 14:45    [6004927]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
andreymx
Petro123
есть NLS коннекта-сессии, а есть БД
Ну а двух сессий?

после коннекта дать ALTER SESSION
либо в реестре поменять HOME
PS. Ты одну сессию поменял?
30 июл 08, 14:58    [6005028]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51767
Petro123
andreymx
Petro123
есть NLS коннекта-сессии, а есть БД
Ну а двух сессий?

после коннекта дать ALTER SESSION
либо в реестре поменять HOME
PS. Ты одну сессию поменял?
Еще раз спрошу - ALTER SESSION - а дальше?
30 июл 08, 14:59    [6005037]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
andreymx
Petro123
andreymx
Petro123
есть NLS коннекта-сессии, а есть БД
Ну а двух сессий?

после коннекта дать ALTER SESSION
либо в реестре поменять HOME
PS. Ты одну сессию поменял?
Еще раз спрошу - ALTER SESSION - а дальше?

softwarer
procedure TForm1.Button1Click(Sender: TObject);
var S : string ;
begin
  Connection.ConnectionString := 'Provider=OraOLEDB.Oracle.1;Password=test;' +
    'Persist Security Info=True;User ID=test;Data Source=svintus' ;
  NLSCommand.CommandText := 'alter session set nls_date_format = ''dd.mm.rrrr''' ;
  NLSCommand.Execute ;
  Command.CommandText := 'select to_char ( max ( last_ddl_time ) ' +
                         'keep ( dense_rank first order by last_ddl_time )) ' +
                         'from dba_objects ' +
                         'where created < :param' ;
  Command.Parameters.ParamByName ( 'param' ).Value := Now ;
  DataSet.RecordSet := Command.Execute ;
  S := DataSet.Fields [ 0 ].AsString ;
  NLSCommand.CommandText := 'alter session set nls_date_format = ''rrrr-mon-dd''' ;
  NLSCommand.Execute ;
  Command.Parameters.ParamByName ( 'param' ).Value := Now ;
  DataSet.RecordSet := Command.Execute ;
  S := S + #13#10 + DataSet.Fields [ 0 ].AsString ;
  Clipboard.AsText := S ;
end;
30 июл 08, 15:03    [6005069]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Результат:

01.10.2002
2002-oct-01
30 июл 08, 15:04    [6005081]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51767
Petro123
Мне не нужен nls_date_format. Мне нужен чарсет (третий параметр NLS_LANG) - как в моем примере.
30 июл 08, 15:04    [6005082]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
если дело в кодировке БД то бесполезно
30 июл 08, 15:05    [6005089]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51767
Petro123
если дело в кодировке БД то бесполезно
Что именно бесполезно?
У меня нормально открываются сессии с разными чарсетами. Они не открываются одновременно с разными чарсетами - только по очереди, когда сессия с другим чарсетом закрыта.
30 июл 08, 15:12    [6005150]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 57408
Блог
andreymx
Это вообще возможно - работать с двумя сессиями в разных кодировках?

Возможно, но пожелание вообще говоря бредовое по определению. NLS_LANG задает кодировку клиента - ту, в которую сервер должен перекодировать данные при отправке и из которой конвертирует при получении. Следовательно, пожелание работать с разными базами в разных кодировках очень похоже на что-то из:

1. Поле, с которым нужно работать as is, ошибочно объявлено символьным и потому перекодируется там, где не нужно (скажем, используется clob там, где надо использовать blob)

2. Кривизна допущена на предыдущих этапах (скажем, в БД уложены данные в левой кодировке) и таким вот макаром идет попытка сделать двойную перекодировку при получении.

В принципе можно придумать случаи, когда такой подход будет правилен, но....
30 июл 08, 15:12    [6005157]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51767
softwarer
2. Кривизна допущена на предыдущих этапах (скажем, в БД уложены данные в левой кодировке) и таким вот макаром идет попытка сделать двойную перекодировку при получении.
так и есть - на постоянной основе будем забирать данные из чужой БД, которую в своё время неверно создали - кодировка WE8ISO8859P1, а пишутся туда русские буквы в Win1251. Перевод этой чужой БД на более "русскую" кодировку в настоящее время не планируется.
30 июл 08, 15:24    [6005241]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
andreymx
Petro123
если дело в кодировке БД то бесполезно
Что именно бесполезно?

select * from nls_database_parameters
?
30 июл 08, 15:25    [6005255]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29041
andreymx
Это вообще возможно - работать с двумя сессиями в разных кодировках?
Попробуй
UseSingleEnvironment := False;
30 июл 08, 15:30    [6005293]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51767
Elic
andreymx
Это вообще возможно - работать с двумя сессиями в разных кодировках?
Попробуй
UseSingleEnvironment := False;
хм... у нас до сих пор ДОА 3.4!!!
30 июл 08, 15:35    [6005333]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51767
Elic
andreymx
Это вообще возможно - работать с двумя сессиями в разных кодировках?
Попробуй
UseSingleEnvironment := False;
Поигрался на 4.1 - не вышло.
Кстати, по умолчанию и стоит
  UseSingleEnvironment: Boolean = False; // Use a single environment for all sessions
пробовал и true и false - ничего.
30 июл 08, 15:41    [6005366]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
странная библиотека. Как может один (типа TADOConnection) зависеть от другого?
30 июл 08, 15:53    [6005453]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9734
Petro123
странная библиотека. Как может один (типа TADOConnection) зависеть от другого?

Ну такая архитектура у OCI :)
Есть environment хендл, он есть корневой хендл для остальных хендлов в приложении - сервера,
сессии, сервиса, команд и т.д. В приложении можно иметь несколько environment хендлов. Именно
этот хендл отвечает за:
- кодировку данных / метаданных которую ожидают получить / возвращают другие хендлы,
связанные с этим environment;
- управлением кэшем объектов;
- параметры LDAP авторизации;
и т.д.

По умолчанию environment инициализируется NLS_LANG. Начиная с OCI 9.2 можно это дело
переопределить, используя OCIEnvNlsCreate.

Т.е. в теории, что бы два соединения имели разные кодировки, нужно:
1) что бы библиотека использовала отдельный environment хендл на каждое соединение;
2) если это < 9.2, то можно попробовать химичить с SetEnvironmentVariable
3) если это >= 9.2, то можно попробовать химичить с OCIEnvNlsCreate

DOA:
1) да, если UseSingleEnvironment = False
2) возможно
3) OCIEnvNlsCreate не использует. Но это не сложно ручками осуществить ...

PS: В грядущей версии AnyDAC можно указать CharacterSet для соединения с Oracle :)
30 июл 08, 16:35    [6005794]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
Альт
Member

Откуда: Сибирь
Сообщений: 4581
и проблемы не решит поднятие нового соединения в отдельном потоке? а вообще автору хочется странного... открыть базу (представиться) и получать данные в одной кодировке... а потом ловко (где?) выгружать(отображать? %)) в другой... не дешевле ли завести еще один слой
30 июл 08, 17:08    [6006035]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9734
Альт
и проблемы не решит поднятие нового соединения в отдельном потоке?

Я бы поменял исходники DOA:
- OCIEnvCreate заменить на OCIEnvNlsCreate
- ей в качестве последнего параметра передавать 0
- в качестве предпоследнего результат OCINlsCharSetNameToId()

Блин делов на час максимум с перекурами :)
30 июл 08, 17:20    [6006115]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли в делфовой проге открыть одновременно 2 разные сессии с разными NLS_LANG?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Dmitry Arefiev
Petro123
странная библиотека. Как может один (типа TADOConnection) зависеть от другого?

Ну такая архитектура у OCI :)

==== каждый раз убеждаюсь, у Oracla всё не как у людей 8-P

Т.е. в теории, что бы два соединения имели разные кодировки, нужно:

===== объект инкапсулирующей все свойства коннекта (у сиквела, сессии у оракля).
Как у TADOConnection в соответствии с ООП.
В ODAC тоже такая муть?


30 июл 08, 17:30    [6006205]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить