문제

의 위치는 어떻게 알 수 있나요? tnsnames.ora Oracle 클라이언트가 설치된 시스템에서 코드별로 파일을 저장합니까?

이 파일의 위치를 ​​나타내는 Windows 레지스트리 키가 있습니까?

도움이 되었습니까?

해결책

몇 년 전에 나는 같은 문제를 겪었습니다.
그 당시에는 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");
    }
}

다른 팁

Windows에서 가장 가능성이 높은 위치는 다음 중 하나입니다. %ORACLE_HOME%/network/admin 또는 %TNS_ADMIN% (또는 TNS_ADMIN 레지스트리 설정).이 두 가지는 거의 모든 설치를 포괄합니다.

물론 이 파일 없이도 Oracle 클라이언트를 작동시킬 수 있습니다.오라클은 엄청나게 다양한 네트워킹 옵션을 보유하고 있으며 TNSNAMES를 사용하여 작업 설정을 달성할 수 있는 방법은 많습니다.여기서 달성하려는 목표에 따라 첫 번째 호출 포트는 sqlnet.ora 파일은 다음에서도 찾을 수 있습니다. %ORACLE_HOME%/network/admin.여기에는 다음과 같은 줄이 포함되어야 합니다.

NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, HOSTNAME)

TNSNAMES 을 사용할 것임을 의미합니다. TNSNAMES.ora 파일(이 경우 두 번째)입니다. 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 이름을 처리하는 방법에 대한 자세한 내용은

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top