我正在尝试将.Net 4.5.2应用程序从使用Microsoft已弃用的System.Data.OracleClient dll迁移到使用Oracle自己的Oracle.ManagedDataAccess.dll(使用Nuget软件包v12.1.1) 0.24160419)。在有问题的机器上我安装了Oracle客户端,并且我有一个tnsnames.ora文件设置,原始应用程序成功用于连接。我也可以成功连接Oracle的SqlPlus和SqlDeveloper工具。但是,如果我尝试使用Oracle DLL我的应用程序无法连接。
要将其提炼到基础知识,我已经创建了一个非常简单的控制台应用程序(下面的代码)来查看正在发生的事情。如果项目引用Microsoft dll(使用适当的using语句),它将连接,但如果我引用Oracle.ManagedDataAccess.dll(使用相应的using语句),它会抱怨TNS错误:
ORA-12504:TNS:听众没有获得CONNECT_DATA中的SERVICE_NAME
我尝试在tnsnames.ora文件中添加一个SERVICE_NAME子句,但没有任何改进。
我还需要做什么?
测试应用是:
<conversation>
<question>
<title>I want to get this parent</title>
<question>
<title>I don´t want to get this one</title>
</question>
<question>
<title>I don´t want to get this one</title>
</question>
</question>
<question>and get this one</question>
<question>and also this one too</question>
</conversation>
答案 0 :(得分:1)
Oracle.ManagedDataAccess.dll
使用不同的搜索模式来查找您的tnsnames.ora
文件。与System.Data.OracleClient或SQL * Plus不同,Oracle.ManagedDataAccess.dll从Registry或Environment变量中不读取TNS_ADMIN
值。
请参阅Oracle Data Provider for .NET, Managed Driver Configuration
dataSources
部分<oracle.manageddataaccess.client>
部分中的数据源别名(即machine.config
,web.config
,user.config
)。tnsnames.ora
指定位置的TNS_ADMIN
文件中的数据源别名。位置可以包含绝对或相对目录路径。tnsnames.ora
位于同一目录中的.exe
文件中的数据源别名。答案 1 :(得分:0)
数据源应该像这样定义:
Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=type_hostname)(PORT=type_port))(CONNECT_DATA=(SERVICE_NAME=type_service_name_from_tsnames)))
连接字符串如:
private const string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=type_hostname)(PORT=type_port))(CONNECT_DATA=(SERVICE_NAME=type_service_name_from_tsnames)));User ID=MATTESTNHSYS;Password=thePassword";