7

tnsnames.oraOracleクライアントがインストールされているマシンで、コードによってファイルの場所を取得するにはどうすればよいですか?

このファイルの場所を示すWindowsレジストリキーはありますか?

4

5 に答える 5

10

数年前、私は同じ問題を抱えていました。
当時、私は Oracle 9 と 10 をサポートする必要があったため、コードはそれらのバージョンのみを処理していましたが、調査の手間を省くことができるかもしれません。アイデアは次のとおりです。

  • レジストリを検索して、Oracle クライアントのバージョンを特定します
  • ORACLE_HOME を検索してみてください
  • 最後に 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");
    }
}
于 2010-01-05T13:54:58.430 に答える
7

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解決する別の方法です。ファイルが存在しない場合、適切な場所に存在する場合TNSNAMESTNSNAMES.oraファイルは無視されます。

C# / .NET では、これにより環境変数が取得されます。

Environment.GetEnvironmentVariable("ORACLE_HOME");

Environment.GetEnvironmentVariable("TNS_ADMIN");

于 2010-01-05T13:34:52.660 に答える
2
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); }
于 2010-01-05T13:38:47.010 に答える
0

Oracle のバージョンと SQL*Plus プロセスの作業ディレクトリに依存するネットによると。この最初のリンクは、Oracle の一部のバージョン (7、8、9i) のベース パスを指定する環境変数を示しています。別のものを使用する場合は、システム ディレクトリにアクセスする同様の方法があるはずです。

ただし、これらのファイルのバージョンをあちこちに広げて、クライアントの「最初にローカルの tnsnames.ora を探す」動作に依存している場合は、運が悪いと思います。

于 2010-01-05T13:33:04.357 に答える
0

私はそのことについてC#やWindowsの男ではないので、うまくいけばこれが役に立ちます。tnsnames.ora ファイルは次の場所にあります。

ORACLE_HOME\network\admin

別の場所が指定されている場合は、TNS_ADMIN レジストリ キーを介して利用できるはずです。

Oracle が Windows で tns 名を処理する方法の詳細については、このリンクを参照してください。

于 2010-01-05T13:36:29.230 に答える