Question

Comment puis-je obtenir l'emplacement du fichier tnsnames.ora par code, dans une machine avec le client Oracle installé?

Y at-il une clé de Registre de fenêtres indiquant l'emplacement de ce fichier?

Était-ce utile?

La solution

Il y a quelques années, j'ai eu le même problème.
À l'époque, je devais soutenir Oracle 9 et 10 de sorte que le code ne prend soin de ces versions, mais peut-être vous épargnerez de quelques recherches. L'idée est de:

  • recherche dans le registre pour déterminer la version du client Oracle
  • essayer de trouver la ORACLE_HOME
  • enfin obtenir les tnsnames de HOME

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");
    }
}

Autres conseils

Sous Windows, les endroits les plus probables sont soit %ORACLE_HOME%/network/admin ou %TNS_ADMIN% (ou le paramètre de Registre TNS_ADMIN). Ces deux couvrent presque toutes les installations.

Bien sûr, il est possible d'avoir un travail client Oracle sans ce fichier. Oracle a nombre ahurissant d'options de mise en réseau, et il y a beaucoup de façons de réaliser une configuration de travail avec l'aide TNSNAMES. Selon ce que vous essayez d'atteindre ici, votre premier port d'escale pourrait être le fichier sqlnet.ora, qui se trouve aussi dans %ORACLE_HOME%/network/admin. Cela devrait contenir une ligne qui ressemble à quelque chose comme ceci:

NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, HOSTNAME)

TNSNAMES signifie qu'il utilisera le fichier TNSNAMES.ora (deuxième dans ce cas). LDAP et HOSTNAME sont d'autres moyens de résoudre la base de données. S'il n'y a pas TNSNAMES le fichier TNSNAMES.ora sera ignorée si elle existe au bon endroit.

Dans C # / .NET cela devrait vous obtenir les variables d'environnement:

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); }

Selon le net qui dépend de la version d'Oracle et le répertoire de travail de SQL * Plus processus. Ce premier lien vous indique le la variable d'environnement qui spécifie le chemin de base pour certaines versions (7, 8, 9i) d'Oracle. Si vous utilisez un autre, je suis sûr qu'il ya une manière similaire à obtenir dans le répertoire système.

Si vous étalez les versions de ces fichiers dans tous les sens et bien compter sur la « recherche d'un tnsnames.ora local d'abord » le comportement du client, alors je suppose que vous êtes hors de la chance.

Je ne suis pas un C # ou un gars Windows pour cette question si nous espérons que cela aide. Le fichier tnsnames.ora doit se trouver dans:

ORACLE_HOME\network\admin

Si un autre emplacement a été spécifié, il devrait être disponible via la clé de Registre TNS_ADMIN.

Voir cette pour plus d'informations sur la façon dont Oracle gère tns Les noms sous Windows.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top