Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ODP.NET托管-找不到请求的.NET Framework数据提供程序_C#_.net_Oracle_Odp.net - Fatal编程技术网

C# ODP.NET托管-找不到请求的.NET Framework数据提供程序

C# ODP.NET托管-找不到请求的.NET Framework数据提供程序,c#,.net,oracle,odp.net,C#,.net,Oracle,Odp.net,使用Visual Studio 2013,我已将最新版本的ODP.NET Managed添加到使用Nuget的项目中: Install-Package odp.net.managed 现在,当我尝试运行以下代码时: Database db = DatabaseFactory.CreateDatabase(); 它引发以下异常: An exception of type 'System.ArgumentException' occurred in System.Data.dll but w

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

Install-Package odp.net.managed

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

Database db = DatabaseFactory.CreateDatabase();
它引发以下异常:

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.
在阅读了其他用户的类似问题后,我将托管驱动程序部分添加到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>

但这没有影响

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

<connectionStrings>
    <add name="OneCDPBuild" 
    providerName="Oracle.ManagedDataAccess.Client" 
    connectionString="Data Source=database;user id=IDhere;pwd=passwordhere;" />
  </connectionStrings>

我将以下内容添加到我的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>

我首先要做一个直接测试,避免工厂方法:

var conn = new Oracle.ManagedDataAccess.Client.OracleConnection("your connection string");
conn.Open();
此处的任何问题要么与bin目录中缺少的Oracle.ManagedDataAccess.dll有关,要么与连接字符串引起的连接问题有关(假设您已经可以通过其他方式连接到Oracle实例)

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

var factory = DbProviderFactories.GetFactory("ODP.NET, Managed Driver");
var conn = factory.CreateConnection();

我认为,如果您一步一个脚印地进行,您会得到更好的反馈。

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

我听从了b_levitt的建议,并确认可以在不使用工厂的情况下手动打开连接,因此ODAC已安装并工作,但工厂方法无法定位组件

在不知透露了多少时间后,我发现问题出在32位版本的.NET framework的machine.config文件上。它不包括oracle提供程序的条目,因此我手动将以下条目添加到此文件:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.Config

<configuration>
  <configSections>

确保您具有以下两个部分实体:

<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" />

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

下一步,在

  <system.data>
    <DbProviderFactories>

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

  <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" />


添加这些条目后,一切正常。

我解决了我的问题,将的IIS应用程序池配置更改为
FALSE


我遇到异常
未能找到或加载注册的.Net Framework数据提供程序,因为我安装的ODAC用于
64位
,并且我的应用程序池使应用程序以
32位
运行,而Oracle未上载Nuget包。它可能没有做允许ODP.NET被视为提供者工厂所需的事情。为了获得最佳效果,请从OTN网页安装ODP.NET托管提供程序:为什么需要托管和非托管驱动程序?Oracle提供的托管驱动程序不是要替换非托管驱动程序吗?machine.config包含全局设置,不知道客户机的目标是什么(托管还是非托管),您可能希望促进这两种驱动程序的使用。将来的读卡器。我在这里的问题上添加了一些“System.Data.Common.DbProviderFactorys.GetFactoryClasses”代码:我对此投了更高的票,因为它让我走得更远,但我的GetFactory I仍然失败……尽管System.Data.Common.DbProviderFactorys.GetFactoryClasses说“它在那里”。