【问题标题】:ODP.NET Managed - Unable to find requested .Net Framework Data ProviderODP.NET 托管 - 找不到请求的 .Net Framework 数据提供程序
【发布时间】:2014-10-12 21:38:55
【问题描述】:

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

Install-Package odp.net.managed

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

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

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>

我在我的网络配置中添加了以下内容:

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

【问题讨论】:

标签: c# .net oracle odp.net


【解决方案1】:

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

我听从了 b_levitt 的建议,确认可以在不使用工厂的情况下手动打开连接,因此 ODAC 已安装并正常工作,但工厂方法无法找到程序集。

经过一段时间未公开的时间后,我发现问题出在 .NET 框架的 32 位版本的 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" />

添加这些条目后,一切都对我有用。

【讨论】:

  • 为什么需要托管和非托管驱动程序? Oracle提供的托管驱动不是要代替非托管的吗?
  • machine.config 保存全局设置,不知道客户端的目标是什么(托管与非托管),您可能希望促进两者的使用。
【解决方案2】:

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

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();

我认为,如果您一次迈出一步,您将获得更好的反馈。

【讨论】:

  • 未来的读者。我在这里的问题上添加了一些“System.Data.Common.DbProviderFactories.GetFactoryClasses”代码:stackoverflow.com/questions/63248855/… 我对此表示赞同,因为它让我更进一步,但我的 GetFactory 我仍然失败......即使 System.Data。 Common.DbProviderFactories.GetFactoryClasses 说“它在里面”。
【解决方案3】:

我解决了将Enable 32-bit ApplicationIIS 应用程序池 配置更改为FALSE 的问题。

我收到了异常 Failed to find or load the registered .Net Framework Data Provider,因为我安装的 ODAC 是为 64-bit 而我的应用程序池应用在 32-bit 运行。

【讨论】:

    猜你喜欢
    • 2013-07-05
    • 2012-06-06
    • 1970-01-01
    • 2013-02-18
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    相关资源
    最近更新 更多