tnsnames.ora
Oracleクライアントがインストールされているマシンで、コードによってファイルの場所を取得するにはどうすればよいですか?
このファイルの場所を示すWindowsレジストリキーはありますか?
数年前、私は同じ問題を抱えていました。
当時、私は Oracle 9 と 10 をサポートする必要があったため、コードはそれらのバージョンのみを処理していましたが、調査の手間を省くことができるかもしれません。アイデアは次のとおりです。
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 レジストリ設定) です。これら 2 つは、ほぼすべてのインストールに対応します。
もちろん、このファイルがなくても Oracle クライアントを動作させることは可能です。Oracle には途方もない数のネットワーク オプションがあり、TNSNAMES を使用して動作するセットアップを実現する方法はたくさんあります。ここで達成しようとしていることに応じて、最初の呼び出し先はsqlnet.ora
ファイルである可能性があります。このファイルは にもあります%ORACLE_HOME%/network/admin
。これには、次のような行が含まれている必要があります。
NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, HOSTNAME)
TNSNAMES
ファイルを使用することを意味しTNSNAMES.ora
ます (この場合は 2 番目)。 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 プロセスの作業ディレクトリに依存するネットによると。この最初のリンクは、Oracle の一部のバージョン (7、8、9i) のベース パスを指定する環境変数を示しています。別のものを使用する場合は、システム ディレクトリにアクセスする同様の方法があるはずです。
ただし、これらのファイルのバージョンをあちこちに広げて、クライアントの「最初にローカルの tnsnames.ora を探す」動作に依存している場合は、運が悪いと思います。
私はそのことについてC#やWindowsの男ではないので、うまくいけばこれが役に立ちます。tnsnames.ora ファイルは次の場所にあります。
ORACLE_HOME\network\admin
別の場所が指定されている場合は、TNS_ADMIN レジストリ キーを介して利用できるはずです。
Oracle が Windows で tns 名を処理する方法の詳細については、このリンクを参照してください。