ODP.NET托管 - 无法找到请求的.Net Framework数据提供程序

9 .net c# oracle odp.net

使用Visual Studio 2013,我使用Nuget将最新版本的ODP.NET Managed添加到项目中:

Install-Package odp.net.managed
Run Code Online (Sandbox Code Playgroud)

http://www.nuget.org/packages/odp.net.managed/121.1.2

现在,当我尝试运行以下代码时:

Database db = DatabaseFactory.CreateDatabase();
Run Code Online (Sandbox Code Playgroud)

它抛出以下异常:

An exception of type 'System.ArgumentException' occurred 
in System.Data.dll but was not handled in user code
Additional information: Unable to find the requested .Net
Framework Data Provider.  It may not be installed.
Run Code Online (Sandbox Code Playgroud)

在阅读其他用户的类似问题后,我将托管驱动程序部分添加到C:\ Windows\Microsoft.Net\Framework64\v4.0.30319\Config\machine.config:

<system.data>
        <DbProviderFactories><add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
        <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
    </system.data>
Run Code Online (Sandbox Code Playgroud)

但这没有任何影响.

我在web.config中有这样的连接字符串,但是我不确定它是否在查看连接字符串格式,因为它在打开连接之前失败了:

<connectionStrings>
    <add name="OneCDPBuild" 
    providerName="Oracle.ManagedDataAccess.Client" 
    connectionString="Data Source=database;user id=IDhere;pwd=passwordhere;" />
  </connectionStrings>
Run Code Online (Sandbox Code Playgroud)

我在Web配置中添加了以下内容:

<system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client" />
      <add name="ODP.NET, Managed Driver"
           invariant="Oracle.ManagedDataAccess.Client"
           description="Oracle Data Provider for .NET, Managed Driver"
           type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
Run Code Online (Sandbox Code Playgroud)

Yve*_*hon 14

在使用EntityFramework 5将ASP.NET MVC 5应用程序部署到安装了64位版本的ODAC客户端组件的64位服务器时,我遇到了此错误.

我按照b_levitt的建议并确认可以在不使用工厂的情况下手动打开连接,因此ODAC已安装并正常工作,但工厂方法无法找到组件.

在我的头发拉了一段未公开的时间后,我发现问题出在32位版本的.NET框架的machine.config文件中.它没有包含oracle提供程序的条目,因此我手动将以下条目添加到此文件中:

C:\ WINDOWS\Microsoft.NET \框架\ v4.0.30319\CONFIG\machine.config中

<configuration>
  <configSections>
Run Code Online (Sandbox Code Playgroud)

确保您有以下两个部分:

<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<section name="oracle.dataaccess.client" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
Run Code Online (Sandbox Code Playgroud)

您可以从framework64文件夹下的machine.config文件中获取确切的条目.

接下来,下

  <system.data>
    <DbProviderFactories>
Run Code Online (Sandbox Code Playgroud)

确保您拥有以下两个工厂名称:

  <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  <add name="ODP.NET, Unmanaged Driver" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET, Unmanaged Driver" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
Run Code Online (Sandbox Code Playgroud)

添加这些条目后,一切都在为我工作.

  • 为什么需要托管和非托管驱动程序?Oracle提供的托管驱动程序是不是要替换非托管驱动程序? (3认同)

b_l*_*itt 8

我会先做一个直接测试并避免工厂方法:

var conn = new Oracle.ManagedDataAccess.Client.OracleConnection("your connection string");
conn.Open();
Run Code Online (Sandbox Code Playgroud)

这里的任何问题都与bin目录中缺少的Oracle.ManagedDataAccess.dll或连接字符串引起的连接问题有关(假设您已经可以通过其他方式连接到oracle实例).

至于工厂,看起来你正在使用一些过时的企业库代码.在框架的更高版本中,我相信你会使用:

var factory = DbProviderFactories.GetFactory("ODP.NET, Managed Driver");
var conn = factory.CreateConnection();
Run Code Online (Sandbox Code Playgroud)

我想如果你一步一步,你会得到更好的反馈.