这是我的问题: 我在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 \ 第二:C:\ Oracle \ product \ 11.2.0 \ client_1 \ network \ admin
并在第一个CPU程序工作正常。但是在具有相同连接字符串的第二个上,无法打开连接(ORA-12154)。使用SQL Plus,我可以在两台计算机上连接。
那么,我怎样才能向我的节目展示TNSNAMES的正确路径?
答案 0 :(得分:12)
您可以通过编程方式设置TNS_ADMIN
环境变量。请参阅此页面了解step by step.如果您想要更改为特定的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个选项
请see this question,它可以帮助您找到客户端TNS_NAMES.ORA
文件的当前位置 - 如果您愿意,可以打开并修改(如果不存在则添加您自己的连接)< / p>
答案 1 :(得分: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;
答案 2 :(得分:2)
您不需要安装ODP.NET(或Oracle客户端),因为您似乎拥有本地可分发的内联oracle客户端所需的DLL。在您的情况下,可以让TNSNAMES.ORA文件与您的可执行文件位于同一文件夹中,您的专用“内联oracle客户端”将从那里获取它。否则,应用程序本地的oracle客户端将尝试从计算机上安装的任何客户端中获取它。