Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 получить список установленных клиентов Orcale в ODAC  [new]
Belotsky Serge
Member

Откуда: Гомель
Сообщений: 312
Hi!

Есть ли какой-либо энумератор (enumerator) или другой способ для получения списка доступных клиентов Orcale в ODAC, ну что-то по типу OraServerEnumerator для получения списка серверов зарегистрированных во всех(?) TNSNAMES.ORA видимых из реестра. Сейчас я анализирую реестр и извлекаю все пути клиентов, но может есть такая возможность в ODAC, чтобы исключить лишний код?

Спасибо.

С уважением, Сергей Б.
30 сен 13, 14:37    [14901846]     Ответить | Цитировать Сообщить модератору
 Re: получить список установленных клиентов Orcale в ODAC  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1175
Belotsky Serge,

Если Вы имеете ввиду ODAC для Delphi, то Вы можете использовать следующий код для получения всех серверов во всех TNSNAMES.ORA

var
  OraSession: TOraSession;
  ConnectDialog: TConnectDialog;
  SrvLst, tmpLst: TStringList;
  i: Integer;
begin
  SrvLst := TStringList.Create;
  try
    SrvLst.Sorted := False;
    OraSession := TOraSession.Create(nil);
    try
      InitOCI;
      ConnectDialog := TConnectDialog.Create(nil);
      try
        OraSession.ConnectDialog := ConnectDialog;
        for i := Low(OracleHomes) to High(OracleHomes) do begin
          OraSession.HomeName := OracleHomes.Name;
          tmpLst := TStringList.Create;
          try
            ConnectDialog1.GetServerList(tmpLst);
            SrvLst.AddStrings(tmpLst);
          finally
            tmpLst.Free;
          end;
        end;
      finally
        OraSession.ConnectDialog := nil;
        ConnectDialog.Free;
      end;
    finally
      OraSession.Free;
    end;
    for i := 0 to SrvLst.Count - 1 do
      ShowMessage(SrvLst[i]);
  finally
    SrvLst.Free;
  end;
1 окт 13, 16:15    [14908005]     Ответить | Цитировать Сообщить модератору
 Re: получить список установленных клиентов Orcale в ODAC  [new]
Belotsky Serge
Member

Откуда: Гомель
Сообщений: 312
devart,

Спасибо за идею, хотя вообще-то вопрос был про список клиентов доступных из реестра (чтобы самому не обрабатывать реестр).

А для получения списка серверов, сейчас я делаю так:
 try
  OraServerEnumerator := TOraServerEnumerator.Create;
  OraServerEnumerator.GetServerList(cbServerList.Items);
 finally
  FreeAndNil(OraServerEnumerator);


Хотя подозреваю, что так некорректно. Думаю, что таким образом извлекаются сервера из TNSNAMES.ORA клиента по умолчанию.

С уважением, Сергей Б.
1 окт 13, 17:31    [14908536]     Ответить | Цитировать Сообщить модератору
 Re: получить список установленных клиентов Orcale в ODAC  [new]
Belotsky Serge
Member

Откуда: Гомель
Сообщений: 312
devart,

PS: Что за переменная OracleHomes, когда она актуальна?
1 окт 13, 17:33    [14908548]     Ответить | Цитировать Сообщить модератору
 Re: получить список установленных клиентов Orcale в ODAC  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1175
Belotsky Serge,

OracleHomes - это массив TOracleHomeInfo, который инициализируется при вызове метода InitOCI.

  TOracleHomeInfo = record
    Key: string;     //Ключ реестра
    Name: string;  //Имя клиента заданное в реестре
    Path: string;   //путь к клиенту
  end;
2 окт 13, 11:04    [14910885]     Ответить | Цитировать Сообщить модератору
 Re: получить список установленных клиентов Orcale в ODAC  [new]
rasputinboris
Member

Откуда:
Сообщений: 49
Доброго времени суток,
Можете демку проги прислать, а то у меня не получается воплотить ваше обсуждение.......
2 дек 13, 14:19    [15225283]     Ответить | Цитировать Сообщить модератору
 Re: получить список установленных клиентов Orcale в ODAC  [new]
rasputinboris
Member

Откуда:
Сообщений: 49
devart
Belotsky Serge,

OracleHomes - это массив TOracleHomeInfo, который инициализируется при вызове метода InitOCI.

  TOracleHomeInfo = record
    Key: string;     //Ключ реестра
    Name: string;  //Имя клиента заданное в реестре
    Path: string;   //путь к клиенту
  end;


что это за метод, какой код?????
2 дек 13, 15:16    [15225887]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: получить список установленных клиентов Orcale в ODAC  [new]
evvcom
Member

Откуда: Домодедово
Сообщений: 12
Сейчас смотрю исходники ODAC 8.5, хотя и они уже не свежие.
В них самое интересное происходит в OraCall.DetectOCI: определяются OracleHomeCount, OracleHomePaths, OracleHomeKeys и OracleHomeNames, а также дефолтные и текущие значения.

Полез разбираться в реализации, т.к. криво определяется список строк подключения на x64 винде с установленным x64 ораклом (и клиентом) 12с и 32-разрядным клиентом 11g. Оба homes\bin прописаны в Paths окружения (по порядку сначала 11, потом 12). При поиске tnsnames.ora ищется просто 'tnsnames.ora' безо всяких 'c:\oracle\product\11.1.0\client_1\bin\', поэтому "повезло" tnsnames из 12.1.0\dbhome_1\bin, а он у меня не настроен, т.к. для 32-разрядного приложения специально ставили 11-го клиента.

Ну и раз уж написал об этом, пути решения:
1. Найти более свежую версию ODAC (может быть там этот косяк поправили)
2. Поправить генофонд, хотя очень этого не люблю делать. Но функция-метод не виртуальная, то что она вызывает - тоже не виртуальное, в итоге кода много, чтобы всё это в наследниках перекрыть. Конкретно ошибка в OraServices.TOraServerEnumerator.GetTNSFileName строки 1585 и 1590.
16 фев 15, 17:15    [17272956]     Ответить | Цитировать Сообщить модератору
 Re: получить список установленных клиентов Orcale в ODAC  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1175
evvcom,

Это поведение уже исправлено, ODAC будет искать те клиенты которые соответствует разрядности приложения. Эти изменения войдут в ближайшую версию ODAC.
18 фев 15, 10:26    [17279838]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить