4

我最近在我的一台开发服务器中部署了一个 Web 应用程序。我正在使用 oracle、asp.net 和 c#。当我在服务器中运行应用程序时,一切正常,但是当我尝试在服务器外部运行应用程序时(例如,使用我的电脑)我收到此错误:

ORA-12154: TNS:could not resolve the connect identifier specified

如果我用 Visual Studio 在我的电脑上运行该应用程序,它工作正常。

Oracle 安装在服务器“A”中,应用程序安装在服务器“B”中。服务器“A”在一个域中,服务器“B”在另一个域中。我的电脑在同一个域中,有服务器“A”。

在我的电脑中,我可以在 C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN 中找到文件 tnsname.ora,但在服务器“B”中我无法在任何地方找到它

任何的想法?谢谢您的帮助。

4

9 回答 9

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 网络服务管理员指南或 Oracle 操作系统特定指南。

于 2008-10-02T14:59:15.820 回答
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 地址。

于 2008-10-02T15:14:51.680 回答
0

猜测:服务器 B 上没有安装 oracle 客户端。

如果您确实安装了 oracle 客户端,那么您仍然可以将 tnsnames 文件放在任何位置(例如网络共享上的目录)。为此,请将 TNS_ADMIN 系统变量(XP 上的系统属性->高级->环境变量)设置到包含 tnsnames 文件的目录。

以我为例,我有一个系统变量:TNS_ADMIN - C:\oracle\ora92\network\ADMIN

于 2008-10-02T14:59:28.193 回答
0

是否在服务器 B 上设置了 ORACLE_HOME?

于 2008-10-02T14:59:57.223 回答
0

看来您需要在“服务器 B”(应用程序服务器)上安装 Oracle 客户端,并将其配置为 TNSNAMES.ORA 文件。这是必需的,否则运行代码将不知道在哪里查找您在应用程序中使用的数据库(可能您在 web.config 中配置了数据源或硬编码)。请记住 - 如果没有 Oracle 客户端,您将无法(轻松)访问 Oracle。

于 2008-10-02T15:00:29.937 回答
0

有同样的问题。原来部署环境中的 TNSNAMES.ORA 具有不同的 ADDRESS_NAME 和 SID/SERVICE_NAME ,并且应用程序被配置为使用 SID - 这导致了问题。

您的连接字符串必须包含 ADDRESS_NAME 而不是 SID

于 2012-10-22T08:02:33.817 回答
0

可能的解决方案 -

验证 TNSNAMES.ORA 是否存在并且可以访问。

确保 TNSNAMES.ORA 中没有语法错误。

验证连接字符串是否正确。

验证是否存在任何 DNS 问题。

如果问题是在使用 PL sql developer client 连接到服务器时。尝试在 Program File 而不是 Program Files(x86) 中安装 SQL developer

于 2013-12-24T02:41:17.130 回答
0

添加环境:

Variable Name: TNS_ADMIN

Variable Value: (YourDrive):\app\(UserName)\product\11.2.0\dbhome_1\NETWORK\ADMIN
于 2014-01-07T07:34:53.797 回答
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 IdPassword

于 2016-09-17T11:56:47.690 回答