我有:
赢了7(64)
VS 2010
Oracle客户端11g(32-客户端_1 | 64-客户端_2)
ODP.NET(32-c:\ oracle \ | 64-c:\ oracle64)
我的旧项目C#在项目引用中添加了Oracle.DataAccess.dll(v2)。
在Win PATH中,我只有C:\ Oracle11g \ product \ 11.2.0 \ client_2 \ bin; (64)
如果我确实以任何模式启动应用程序,则会出现ORA错误
Oracle.DataAccess.Client.OracleException ORA-12154: TNS:could not resolve the connect identifier specified
在app.config中
<connectionStrings>
<add name="ConnectionStringTEST" connectionString="DATA SOURCE=TEST;PASSWORD=TEST;PERSIST SECURITY INFO=True;USER ID=TEST"
providerName="Oracle.DataAccess.Client" />
</connectionStrings>
我怎么知道什么TNSNAMES库在C#应用程序中使用Oracle.DataAccess.dll?
我在REGEDIT中正确设置了所有ORACLE_HOME(等)。
我以为是使用PATH系统中列出的目录中的tns_names的,但是我发现它使用ODP.net的tns_names,所以我将其安装到c:\ oracle \(32)中,为什么? ()
我不知道为什么它不使用系统PATH中引用的标准Oracle客户端。
在安装了该客户端的其他计算机上,只有一个oracle客户端(32)编译的应用程序运行时没有问题(错误)。
最佳答案
我建议您完全跳过TNS名称。如果可以成功地在任何计算机上tnsping
服务器并在其中获取所需的元素,则可以改用Oracle的EzConnect字符串。这有几个优点:
如您所提到的,当您安装了多个版本时,就不会造成混淆-没关系,因为您没有使用tnsnames
在他人的计算机上进行部署时,它们的tnsnames的正确设置没有依赖性。
如果服务器已迁移,则可以更新代码,而不必担心该应用程序的任何目标计算机是否已更新tnsnames
优势3是一把双刃剑,因为使用tnsnames,您可以编辑tns文件,而不必处理更改连接字符串的问题,但是我认为这是一个很小的代价。
因此,如果您对测试进行tnsping测试,通常会说Data Source=TEST
:
> tnsping test
你会得到这样的东西:
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = myserver.foo.com)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = TEST)))
您可以将数据源字符串更改为:
Data Source=myserver.foo.com:1521/TEST