我最近在我的一个开发服务器中部署了一个Web应用程序。我正在使用oracle,asp.net和c#。当我在服务器中运行应用程序时一切正常,但当我尝试在服务器外运行应用程序(例如,使用我的电脑)时,我收到此错误:
ORA-12154: TNS:could not resolve the connect identifier specified
如果我使用visual studio在我的电脑上运行应用程序,它可以正常工作。
Oracle安装在服务器“A”中,应用程序位于服务器“B”中。服务器“A”在一个域中,服务器“B”在其他域中。我的PC在同一个域中有服务器“A”。
在我的电脑中,我可以在C:\ oracle \ product \ 10.2.0 \ client_1 \ NETWORK \ ADMIN中找到文件tnsname.ora,但在服务器“B”中我找不到它
任何想法? 谢谢你的帮助。
答案 0 :(得分:3)
你试过这个吗? (来自http://ora-12154.ora-code.com/)
ORA-12154:TNS:无法解析指定的连接标识符
原因:使用连接标识符请求与数据库或其他服务的连接,并且使用配置的命名方法之一无法将指定的连接标识符解析为连接描述符。例如,如果使用的连接标识符类型是网络服务名称,则无法在命名方法存储库中找到网络服务名称,或者无法找到或到达存储库。
行动:
- 如果您使用的是本地命名(TNSNAMES.ORA文件):
确保“TNSNAMES”列为Oracle Net配置文件(SQLNET.ORA)中NAMES.DIRECTORY_PATH参数的值之一
验证TNSNAMES.ORA文件是否存在且位于正确的目录中且可以访问。
检查TNSNAMES.ORA文件中是否存在用作连接标识符的网络服务名称。
确保TNSNAMES.ORA文件中的任何位置都没有语法错误。寻找无与伦比的括号或流浪汉字符。 TNSNAMES.ORA文件中的错误可能使其无法使用。
如果您使用的是目录命名:
验证“LDAP”是否列为Oracle Net配置文件(SQLNET.ORA)中NAMES.DIRETORY_PATH参数的值之一。
验证LDAP目录服务器是否已启动且可以访问。
验证在目录中是否配置了用作连接标识符的网络服务名称或数据库名称。
通过指定完全限定的网络服务名称或完整的LDAP DN作为连接标识符来验证所使用的默认上下文是否正确
如果您使用简易连接命名:
验证“EZCONNECT”是否列为Oracle Net配置文件(SQLNET.ORA)中NAMES.DIRETORY_PATH参数的值之一。
确保指定的主机,端口和服务名称正确无误。
尝试在引号中包含连接标识符。有关命名的更多信息,请参阅“Oracle Net Services管理员指南”或Oracle操作系统特定指南。
答案 1 :(得分:3)
解决TNS错误可能是一个真正的痛苦。要记住一些事情。
大多数开发环境(如visual studio)都保留了自己的TNS连接信息副本,并且不使用TNSNAMES.ora文件。保存此信息的文件不必称为TNSNAMES.ora,这只是默认名称。这可能是您在服务器B上找不到它的原因。
如果您有oracle客户端软件(或oracle数据库),则可以使用 tnsping 检查您的TNSNAMES.ora文件是否配置正确。
TNSNAMES.ora文件配置中最常出现的问题是使用错误的服务名称和/或使用错误的主机名。您可能需要将“ODB_A”更改为“ODB_A.WORLD”,反之亦然,具体取决于SQL NET设置。对于Oracle 10,后者是默认的SQL NET设置。对于后者,您需要使用 ping 查看服务器“A”,并知道是否需要使用“SERVERA”或“SERVERA.DOMIN.COM”或IP地址。
答案 2 :(得分:0)
猜猜:服务器B上没有安装oracle客户端。
如果您确实安装了oracle客户端,那么您仍然可以将tnsnames文件放在任何位置(例如网络共享上的目录)。为此,请在包含tnsnames文件的目录中设置TNS_ADMIN系统变量(系统属性 - > Advanced-> XP上的环境变量)。
对我来说,例如我有一个系统变量:TNS_ADMIN - C:\ oracle \ ora92 \ network \ ADMIN
答案 3 :(得分:0)
是否在服务器B上设置了ORACLE_HOME?
答案 4 :(得分:0)
您似乎需要在“服务器B”(应用程序服务器)上安装Oracle客户端,并配置它的TNSNAMES.ORA文件。这是必需的,否则,运行代码将不知道在哪里查找您在应用程序中使用的数据库(可能您在web.config中配置了数据源或硬编码的东西)。 请记住 - 如果没有Oracle客户端,您将无法轻松访问Oracle。
答案 5 :(得分:0)
有同样的问题。事实证明,在部署环境中的TNSNAMES.ORA有一个不同的ADDRESS_NAME和SID / SERVICE_NAME,并且应用程序已配置为使用SID - 这导致了问题。
您的连接字符串必须包含ADDRESS_NAME,而不是SID
答案 6 :(得分:0)
可能的决议 -
验证TNSNAMES.ORA是否存在且可访问。
确保TNSNAMES.ORA中没有语法错误。
验证连接字符串是否正确。
验证是否存在任何DNS问题。
如果问题是在使用PL sql developer client.try连接到服务器时在程序文件中安装SQL开发人员而不是程序文件(x86)的
答案 7 :(得分:0)
添加环境:
Variable Name: TNS_ADMIN
Variable Value: (YourDrive):\app\(UserName)\product\11.2.0\dbhome_1\NETWORK\ADMIN
答案 8 :(得分:0)
我遇到过类似的问题。下面的代码在我的系统中工作,但即使我在tnsnames.ora文件中添加了一个tns条目,也没有在另一台服务器上工作。
con = new OracleConnection();
con.ConnectionString = "User Id=username;Password=password;Data Source=uit45";
con.Open(); // throws error here
在挖掘和挖掘之后,我找到了解决方案。我们需要忽略tns文件中的条目,并且可以将tns条目作为连接字符串给出,这对我来说很好。请尝试以下代码。
con = new OracleConnection("Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=db-uit45.xxx)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SID=uit45)));User Id=username;Password=password");
con.Open();
请注意,您需要提供相关值,尤其是HOST,PORT,SID,User Id
和Password
。