Получение местоположения файла tnsnames.Ора по коду
Как я могу получить местоположение tnsnames.ora
файл по коду, на машине с установленным клиентом Oracle?
есть ли раздел реестра windows, указывающий местоположение этого файла?
5 ответов
несколько лет назад у меня была такая же проблема.
Тогда мне приходилось поддерживать Oracle 9 и 10, поэтому код заботится только об этих версиях, но, возможно, это спасает вас от некоторых исследований.
Идея в том, чтобы:
- поиск в реестре для определения версии клиента Oracle
- попробуйте найти ORACLE_HOME
- наконец-то получить tnsnames из дома
public enum OracleVersion
{
Oracle9,
Oracle10,
Oracle0
};
private OracleVersion GetOracleVersion()
{
RegistryKey rgkLM = Registry.LocalMachine;
RegistryKey rgkAllHome = rgkLM.OpenSubKey(@"SOFTWARE\ORACLE\ALL_HOMES");
/*
* 10g Installationen don't have an ALL_HOMES key
* Try to find HOME at SOFTWARE\ORACLE\
* 10g homes start with KEY_
*/
string[] okeys = rgkLM.OpenSubKey(@"SOFTWARE\ORACLE").GetSubKeyNames();
foreach (string okey in okeys)
{
if (okey.StartsWith("KEY_"))
return OracleVersion.Oracle10;
}
if (rgkAllHome != null)
{
string strLastHome = "";
object objLastHome = rgkAllHome.GetValue("LAST_HOME");
strLastHome = objLastHome.ToString();
RegistryKey rgkActualHome = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\ORACLE\HOME" + strLastHome);
string strOraHome = "";
object objOraHome = rgkActualHome.GetValue("ORACLE_HOME");
string strOracleHome = strOraHome = objOraHome.ToString();
return OracleVersion.Oracle9;
}
return OracleVersion.Oracle0;
}
private string GetOracleHome()
{
RegistryKey rgkLM = Registry.LocalMachine;
RegistryKey rgkAllHome = rgkLM.OpenSubKey(@"SOFTWARE\ORACLE\ALL_HOMES");
OracleVersion ov = this.GetOracleVersion();
switch(ov)
{
case OracleVersion.Oracle10:
{
string[] okeys = rgkLM.OpenSubKey(@"SOFTWARE\ORACLE").GetSubKeyNames();
foreach (string okey in okeys)
{
if (okey.StartsWith("KEY_"))
{
return rgkLM.OpenSubKey(@"SOFTWARE\ORACLE\" + okey).GetValue("ORACLE_HOME") as string;
}
}
throw new Exception("No Oracle Home found");
}
case OracleVersion.Oracle9:
{
string strLastHome = "";
object objLastHome = rgkAllHome.GetValue("LAST_HOME");
strLastHome = objLastHome.ToString();
RegistryKey rgkActualHome = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\ORACLE\HOME" + strLastHome);
string strOraHome = "";
object objOraHome = rgkActualHome.GetValue("ORACLE_HOME");
string strOracleHome = strOraHome = objOraHome.ToString();
return strOraHome;
}
default:
{
throw new Exception("No supported Oracle Installation found");
}
}
}
public string GetTNSNAMESORAFilePath()
{
string strOracleHome = GetOracleHome();
if (strOracleHome != "")
{
string strTNSNAMESORAFilePath = strOracleHome + @"\NETWORK\ADMIN\TNSNAMES.ORA";
if (File.Exists(strTNSNAMESORAFilePath))
{
return strTNSNAMESORAFilePath;
}
else
{
strTNSNAMESORAFilePath = strOracleHome + @"\NET80\ADMIN\TNSNAMES.ORA";
if (File.Exists(strTNSNAMESORAFilePath))
{
return strTNSNAMESORAFilePath;
}
else
{
throw new SystemException("Could not find tnsnames.ora");
}
}
}
else
{
throw new SystemException("Could not determine ORAHOME");
}
}
в Windows наиболее вероятными местоположениями являются либо %ORACLE_HOME%/network/admin
или %TNS_ADMIN%
(или параметр реестра TNS_ADMIN). Эти два покрывают почти каждую установку.
конечно, можно иметь рабочий клиент Oracle без этого файла. Oracle имеет ошеломляющий массив сетевых опций, и есть много способов достичь рабочей настройки с использованием TNSNAMES. В зависимости от того, чего вы пытаетесь достичь здесь, ваш первый порт вызова может быть sqlnet.ora
файл, который также найдено в %ORACLE_HOME%/network/admin
. Это должно содержать строку, которая выглядит примерно так:
NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, HOSTNAME)
TNSNAMES
означает, что он будет использовать TNSNAMES.ora
file (второй в этом случае). LDAP
и HOSTNAME
альтернативные способы разрешения базы данных. Если нет TNSNAMES
на TNSNAMES.ora
файл будет проигнорирован, если он существует в нужном месте.
в C# / .NET это должно получить вам переменные среды:
Environment.GetEnvironmentVariable("ORACLE_HOME");
Environment.GetEnvironmentVariable("TNS_ADMIN");
List<string> logicalDrives = Directory.GetLogicalDrives().ToList();
List<string> result = new List<string>();
foreach (string drive in logicalDrives)
{
Console.WriteLine("Searching " + drive);
DriveInfo di = new DriveInfo(drive);
if(di.IsReady)
result = Directory.GetFiles(drive, "tnsnames.ora", SearchOption.AllDirectories).ToList();
if (0 < result.Count) return;
}
foreach (string file in result) { Console.WriteLine(result); }
в соответствии с сетью, которая зависит от версии Oracle и рабочего каталога процесса SQL*Plus. Это первая ссылка сообщает вам переменную среды, которая задает базовый путь для некоторых версий (7, 8, 9i) Oracle. Если вы используете другой, я уверен, что есть аналогичный способ добраться до системного каталога.
Если вы распространяете версии этих файлов повсюду, хотя и полагаетесь на "ищите локальные имена tnsnames.ora first " поведение клиент, значит, тебе не повезло.
Я не C# или парень Windows, если на то пошло, поэтому, надеюсь, это поможет. Файла tnsnames.файл ora должен находиться в:
ORACLE_HOME\network\admin
если указано альтернативное расположение, оно должно быть доступно через раздел реестра TNS_ADMIN.
посмотреть этот ссылке для получения дополнительной информации о том, как Oracle обрабатывает имена tns в Windows.