Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过代码获取文件tnsnames.ora的位置_C#_C++_Oracle_Delphi_Oracle11g - Fatal编程技术网

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

C# 通过代码获取文件tnsnames.ora的位置,c#,c++,oracle,delphi,oracle11g,C#,C++,Oracle,Delphi,Oracle11g,在安装了Oracle客户端的计算机中,如何逐代码获取tnsnames.ora文件的位置 是否有windows注册表项指示此文件的位置?根据网络,取决于Oracle版本和SQL*Plus进程的工作目录。告诉您指定Oracle某些版本(7、8、9i)的基本路径的环境变量。如果使用不同的方法,我相信也有类似的方法来访问系统目录 如果您将这些文件的版本散布到各地,并依赖客户端的“先查找本地tnsnames.ora”行为,那么我猜您运气不好。在Windows上,最有可能的位置是%ORACLE\u HOME

在安装了Oracle客户端的计算机中,如何逐代码获取
tnsnames.ora
文件的位置


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

根据网络,取决于Oracle版本和SQL*Plus进程的工作目录。告诉您指定Oracle某些版本(7、8、9i)的基本路径的环境变量。如果使用不同的方法,我相信也有类似的方法来访问系统目录


如果您将这些文件的版本散布到各地,并依赖客户端的“先查找本地tnsnames.ora”行为,那么我猜您运气不好。

在Windows上,最有可能的位置是
%ORACLE\u HOME%/network/admin
%TNS\u admin%
(或TNS\u admin注册表设置)。这两种方法几乎涵盖了所有安装

当然,在没有此文件的情况下,Oracle客户端也可以正常工作。Oracle有一系列令人困惑的网络选项,使用TNSNAMES实现工作设置的方法很多。根据您在此尝试实现的目标,您的第一个调用端口可能是
sqlnet.ora
文件,该文件也可以在
%ORACLE\u 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”)

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

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

有关Oracle如何在Windows上处理tns名称的详细信息,请参见此部分。

List logicalDrives=Directory.GetLogicalDrives().ToList();
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); }
列表结果=新列表(); foreach(逻辑驱动器中的字符串驱动器) { 控制台写入线(“搜索”+驱动器); DriveInfo di=新的DriveInfo(驱动器); 如果(di.IsReady) 结果=Directory.GetFiles(驱动器“tnsnames.ora”,SearchOption.AllDirectories).ToList(); 如果(0
几年前我也有同样的问题。
当时我必须支持Oracle 9和10,所以代码只考虑这些版本,但也许它可以让您省去一些研究。 其想法是:

  • 搜索注册表以确定oracle客户端版本
  • 试着找到甲骨文的家
  • 终于从家里拿到了tnsnames


这列出了tnsnames.ora的每个副本。我的问题不是,但你是对的,不清楚。实际上,确定使用哪个tnsnames.ora通常很重要,但我认为你的回答仍然是一个有用的贡献,我补充了一条警告,所以我给了你一个向上的投票,以抵消你收到的向下的投票。这个链接有点过时,但在最新版本(11g)中,行为基本相同。@Colin,不幸的是,oracle客户端并不总是设置这些变量。我使用的是oracle 11g。您使用的是即时客户端还是普通客户端?我相信即时客户端不会默认创建%oracle_HOME%或tnsnames.ora。在Windows下,您必须查看注册表HKLM\Software\oracle-您会在那里找到oracle主路径,请注意可能有多个oracle主目录,Oracle允许在自己的家中安装多个版本。+1看起来是一个合理的起点。当然,考虑到非标准安装和各种解决方案,以及像即时客户端这样的东西,可能会让您头发花白。您应该尝试在GetOracleHome()中的注册表之前使用环境变量尽管如此。谢天谢地,我不再需要追赶Oracle了,因为现在有人在维护这段代码:)但是在查询注册表之前检查环境听起来不错。你知道“编程”意味着“按代码”,对吗?@George我正在寻找一种解决方案,不一定基于windows注册表,因此,请再次编辑该问题。
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");
    }
}