2016-12-15 161 views
0

我想从使用微软弃用的System.Data.OracleClient DLL迁移.Net 4.5.2应用程序到使用Oracle的拥有Oracle.ManagedDataAccess.dll(使用Nuget包v12.1.1.24160419)。在问题的机器上,我安装了Oracle客户端,并且设置了原始应用程序成功用于连接的tnsnames.ora文件。我也可以成功连接Oracle的SqlPlus和SqlDeveloper工具。但是,如果我尝试使用Oracle DLL,我的应用程序无法连接。无法连接到Oracle 11g数据库使用Oracle.ManagedDataAccess.dll,而不是Microsoft System.Data.OracleClient

为了将这个简单介绍给我,我创建了一个非常简单的控制台应用程序(代码如下)来查看发生了什么。如果该项目引用了Microsoft DLL(用适当的using语句),它将连接,但如果相反,我引用Oracle.ManagedDataAccess.dll(用适当的using语句),报告说有TNS错误:

ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA

我试过向tnsnames.ora文件添加一个SERVICE_NAME子句,但没有任何改进。

我还需要做什么?

测试程序是:

using Oracle.ManagedDataAccess.Client; 
using System; 
using System.Collections.Generic; 
//using System.Data.OracleClient; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace oracleconnect 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       InitializeDBConnection(); 
      } 
      finally 
      { 
       if (_con.State==System.Data.ConnectionState.Open) 
       _con.Close(); 
      } 
     } 

     static private OracleConnection _con; 
     private const string connectionString = "Data Source=oracledbserver2;User ID=MATTESTNHSYS;Password=thePassword"; 



     private static void InitializeDBConnection() 
     { 
      _con = new OracleConnection(); 
      _con.ConnectionString = connectionString; 
      _con.Open(); 
     } 
    } 
} 
+0

你可以显示你的tnsnames文件吗? – nvoigt

+0

ORACLEDBSERVER2 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS =(PROTOCOL = TCP)(HOST = OracleDBServer2)(PORT = 1521)) ) (CONNECT_DATA = (SID = orcdb10g) (SERVER = DEDICATED) ) ) –

回答

0

Oracle.ManagedDataAccess.dll有不同的搜索模式找到你的tnsnames.ora文件。与System.Data.OracleClient或SQL * Plus不同,Oracle.ManagedDataAccess.dll不是而是从注册表或环境变量中读取TNS_ADMIN值。

参见下在.NET配置文件<oracle.manageddataaccess.client>部(即machine.configweb.configuser.config)在dataSourcesOracle Data Provider for .NET, Managed Driver Configuration

  1. 数据源的别名。
  2. tnsnames.ora文件中的数据源别名,位于.NET配置文件中由TNS_ADMIN指定的位置。位置可以由绝对或相对目录路径组成。
  3. tnsnames.ora文件中的数据源别名存在于与.exe相同的目录中。
+0

所以根据这个,将我的'working'tnsnames.ora文件的副本放在应用程序可执行文件夹中就足够了? –

+0

是或在.NET配置文件中创建符号链接或定义它 –

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"; 
+0

好的,谢谢,我会试试。与MS方式完全不同。 –

+0

@NeilHaughton良好的资源也在这里:https://www.connectionstrings.com/oracle-data-provider-for-net-odp-net/ – user2250152

+0

根据该资源,我的连接字符串应该“与TNS”工作。我已经安装了TNS客户端(我有一个tnsnames)。ora文件与Microsoft供应商合作)。看起来,Oracle提供商并没有选择它 - 我需要做额外的工作才能确保它能够找到并读取tnsnames.ora文件? –