5

我有一个使用 ODP.NET dll 的 C# 程序:

oci.dll, ociw32.dll, Oracle.DataAccess.dll,
orannzsbb11.dll, oraocci11.dll, oraociicus11.dll,
OraOps11w.dll. 

我有2台电脑。首先安装了整个 ODAC 包,然后没有安装该包。但是我的 exe 目录中有所有必需的 dll,所以我认为 ODAC 不是问题。

这些计算机之间的区别在于TNSNAMES文件的路径。

First: C:\app\OraHome_1\Network\admin\
Second: C:\Oracle\product\11.2.0\client_1\network\admin

在第一台计算机上,该程序运行良好。但是在第二个具有相同连接字符串的情况下,我得到了错误:

cannot open connection (ORA-12154)

使用 SQL Plus,我可以在两台计算机上进行连接。如何向我的程序显示tnsnames.ora文件的正确路径?

4

3 回答 3

13

您可以以TNS_ADMIN编程方式设置环境变量。请参阅此页面以逐步了解。 也就是说,如果您想更改为特定TNS_NAMES.ORA文件。Oracle 客户端仍必须安装在客户端计算机上。

来自ConnectionStrings - 不使用 TNS:

Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort))(CONNECT_DATA=(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword;


编辑:添加了第三个选项

参阅这个问题,它可以帮助您找到客户端文件的当前位置TNS_NAMES.ORA- 如果您愿意,您可以打开和修改(如果不存在,请添加您自己的连接)

于 2012-05-16T12:33:58.940 回答
3

您无需关心 TNSNames 文件的路径:库本身会自动发现它……一旦您安装了它。这是关键点:在您的项目中分发 dll 是不够的。您需要在需要使用 ODP.Net 的机器上安装它:实际上,安装只是创建了一些注册表项,其中一个指向正确的 oracle 目录(库可以在需要时在其中找到 tnsnames)。

Morover,正如有人指出的那样,您根本不需要 tnsnams 文件。您可以在连接字符串中写入所需的所有内容。这是我在我的环境中使用的一个:

Data Source= (DESCRIPTION =
      (ENABLE = BROKEN)
      (ADDRESS_LIST =
      (LOAD_BALANCE = ON)
      (FAILOVER = ON)
      (ADDRESS = (PROTOCOL = TCP)(Host =por10srv-a)(Port = 1521))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = por10.gruppo.autostrade.it)
      (FAILOVER_MODE =
      (TYPE = SELECT)
      (METHOD = BASIC)
      (RETRIES = 10)
      (DELAY = 3)
      )
      )
      );User ID=npa_collaudo;Password=npa_collaudo;
于 2012-05-16T12:33:05.763 回答
2

您不需要安装 ODP.NET(或就此而言的 Oracle 客户端),因为您似乎拥有本地可分发内联 oracle 客户端所需的 DLL。在您的情况下,TNSNAMES.ORA 文件可能与您的可执行文件位于同一文件夹中,并且您的专用“内联 oracle 客户端”将从那里获取它。否则,应用程序本地的 oracle 客户端将尝试从机器上安装的任何客户端获取它。

于 2015-03-05T13:31:06.613 回答