越来越位置的文件tnsnames.ora通过代码
题
我怎么能得到的位置 tnsnames.ora
文件通过代码,在一个机Oracle客户安装?
有没有窗户注册的关键指示的位置,这个文件?
解决方案
几年前我有同样的问题。
回然后我不得不支持Oracle9和10个这样的代码,只需要照料的这些版本,但是也许这样可以节省你的一些研究。这个想法是:
- 查询登记处以确定oracle客户的版本
- 试图找到ORACLE_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注册表键可用。
请参阅此链接的更多信息,甲骨文如何处理TNS在Windows名称。