代码之家  ›  专栏  ›  技术社区  ›  RRUZ

通过代码获取文件tnsnames.ora的位置

  •  7
  • RRUZ  · 技术社区  · 16 年前

    tnsnames.ora

    是否有windows注册表项指示此文件的位置?

    5 回复  |  直到 16 年前
        1
  •  10
  •   Thomas Zoechling    16 年前

    几年前我也有同样的问题。
    当时我必须支持Oracle 9和10,所以代码只考虑这些版本,但也许它可以让您省去一些研究。

    • 搜索注册表以确定oracle客户端版本
    • 试着找到甲骨文的家
    • 终于从家里拿到了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");
        }
    }
    
        2
  •  7
  •   Colin Pickard    16 年前

    %ORACLE_HOME%/network/admin %TNS_ADMIN% (或TNS_管理注册表设置)。这两种方法几乎涵盖了所有安装。

    当然,在没有此文件的情况下,Oracle客户端也可以正常工作。Oracle有一系列令人困惑的网络选项,使用TNSNAMES实现工作设置的方法很多。根据您在这里试图实现的目标,您的第一个调用端口可能是 sqlnet.ora 文件,该文件也可在中找到 %ORACLE_HOME%/网络/管理员 . 这应该包含一行如下所示:

    NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, HOSTNAME)
    

    TNSNAMES TNSNAMES.ora LDAP HOSTNAME TNSNAMES 特斯奈姆斯·奥拉

    在C#/.NET中,这应该可以获得环境变量:

    Environment.GetEnvironmentVariable("ORACLE_HOME");

    Environment.GetEnvironmentVariable("TNS_ADMIN");

        3
  •  2
  •   GxG    16 年前
    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); }
    
        4
  •  0
  •   Benjamin Podszun    16 年前

    This first link 告诉您指定Oracle某些版本(7、8、9i)的基本路径的环境变量。如果使用不同的方法,我相信也有类似的方法来访问系统目录。

    但是,如果你将这些文件的版本散布到各地,并依赖客户的“先查找本地tnsnames.ora”行为,那么我猜你就走运了。

        5
  •  0
  •   RC.    16 年前

    我不是一个C#或Windows的家伙,所以希望这能有所帮助。tnsnames.ora文件应位于:

    ORACLE_HOME\network\admin
    

    如果指定了备用位置,则应通过TNS_ADMIN注册表项提供该位置。

    看到这个了吗 link 有关Oracle如何在Windows上处理tns名称的详细信息。