如何在C#应用程序中设置TNSNAMES文件的正确路径?

这是我的问题:我在C#中使用ODP.NET dll的程序:oci.dll,ociw32.dll,Oracle.DataAccess.dll,orannzsbb11.dll,oraocci11.dll,oraociicus11.dll,OraOps11w.dll。

我有2台电脑。 首先安装整个ODAC包,然后安装第二个包。 但我在exe目录中都需要dll,所以ODAC不是问题(我认为)。 这些计算机之间的区别是TNSNAMES文件的路径。 第一个:C:\ app \ OraHome_1 \ Network \ admin \ Second:C:\ Oracle \ product \ 11.2.0 \ client_1 \ network \ admin

并在第一个CPU程序工作正常。 但是在具有相同连接字符串的第二个上,无法打开连接(ORA-12154)。 使用SQL Plus,我可以在两台计算机上连接。

那么,我怎样才能向我的节目展示TNSNAMES的正确路径?

您可以以编程方式设置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; 

编辑:添加第3个选项

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

您无需关心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; 

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