ODP.NET错误无法找到请求的.Net Framework数据提供程序

时间:2013-07-08 13:44:26

标签: c# asp.net asp.net-mvc oracle11g odp.net

我正在尝试使用Oracle 11g Express和.NET 4.0框架开发ASP.NET MVC 4.0应用程序。我可以使用ODP.NET提供程序连接到数据库,也可以针对数据库生成我的EDMX。我不能做的是使用实体框架查询底层数据库。使用生成的connectionString Visual Studio实例化我的DbContext时,出现以下错误:

  

无法找到请求的.Net Framework数据提供程序。它可能没有安装

但是,因为

而安装它
  1. 我可以在GAC中看到dll。
  2. 在machine.config中提到。
  3. 我的项目引用它。
  4. 我实际上用它来从数据库生成我的EDMX。
  5. 我已经确认我到处引用了正确的版本(4.112.3.0)
  6. 我在Cassini本地运行代码,我的硬件是32位架构,所以我假设我只能使用32位DLL,所以这不是架构问题。

    代码的具体位是这样的:

    public class MyContext : ObjectContext, IUnitOfWork
    {
        public MyContext() 
        : base(ConfigurationManager
              .ConnectionStrings["OracleEntities"]
              .ConnectionString)//Connectionstring is verified
        {}
    }
    

    请在我离开之前帮助我,留胡子然后去某个地方的山区生活。

    解决方案:由于我没有看到任何提及解决方案,我会在这里为后代提及它。 Andrei下面询问了我的连接字符串格式,虽然我很狡猾,但我去看看了。这就是我所看到的:

    metadata=res://*/OracleModel.csdl|res://*/
    OracleModel.ssdl|res://*/
    OracleModel.msl;
    provider=provider=Oracle.DataAccess.Client;
    provider connection string="DATA SOURCE=localhost:1521;
    PASSWORD=xxx;PERSIST SECURITY INFO=True;USER ID=xxx
    

    现在,要特别注意这一行

    provider=provider=Oracle.DataAccess.Client;
    

    应该,实际上是

    provider=Oracle.DataAccess.Client;
    

    否则你告诉EF使用[provider.dll],这不是真的。另请注意,似乎connectionString元素的providerName属性似乎已被覆盖或忽略。

    UPDATE 2 :如果此STILL没有帮助,请查看machine.config。您应该看到以下部分:

    <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    
      <remove invariant="Oracle.DataAccess.Client" />
    
    </DbProviderFactories>
    

    如果&lt; remove invariant =“Oracle.DataAccess.Client”/&gt; 存在,请将其注释掉并重试,否则,如果不存在,请将其放入并重试。

9 个答案:

答案 0 :(得分:7)

对我们来说,这是32比64进程。

服务器是64位。 安装的ODP.NET(Oracle客户端)也是64位。 我们的应用程序使用Target平台和#34;任何CPU&#34;和#34;喜欢32位&#34;标志SET:

http://grab.by/v5ki

以32位进程运行。 一旦用未经检查的标志重新编译,一切都开始起作用了。

答案 1 :(得分:4)

通过IIS,64位Win7打开页面时出现同样的错误。

我的解决方案是:

转到IIS管理器 - &gt;应用程序池 - &gt;高级设置 - &gt;启用32位应用程序。

enter image description here

答案 2 :(得分:2)

此错误有点误导,因为它也可能是由错误的CPU上下文运行引起的。如果使用32位Oracle驱动程序,请确保允许32位。这可以在IIS下进行设置,也可以将应用程序设置为IIS Express应用程序。

答案 3 :(得分:2)

我有类似的问题。通过添加NuGet包解决了这个问题。我已经在我的ODT安装引用中提供了Oracle.ManagedDataAccess.EntityFramework,但它在详细日志中给出了实体框架5与6的冲突。一旦我添加了NuGet包,一切都开始工作了。

  • 要安装,请右键点击参考 - &gt;管理NuGet包... - &gt;在“浏览”选项卡中搜索Oracle - &gt;选择Oracle.ManagedDataAccess.EntityFramework并安装最新版本。

答案 4 :(得分:2)

我正在VS2017中创建一个ASP.NET Web表单来连接我的Oracle数据库 并且正在为Gridview添加SqlDataSource。

它连接正常,可以在编译时看到数据,但是在运行时我遇到了相同的问题或错误消息:

无法找到请求的.Net Framework数据提供程序。可能未安装

已解决,方法是使用此处找到的格式更正连接字符串:

Omiting tnsnames.ora Alternative

一旦我使用了该连接字符串格式,我的SqlDataSource就会像这样:

<asp:SqlDataSource ID="SqlDataSource1"
    ConnectionString="<%$ ConnectionStrings:OracleDB %>"
    runat="server"
    ProviderName="<%$ ConnectionStrings:OracleDB.ProviderName %>"
    SelectCommand="SELECT * FROM usertable">
</asp:SqlDataSource>

应用新的连接字符串会更改智能感知赋予的 ProviderName

来自:ProviderName =“ Oracle.DataAccess.Client

至:ProviderName =“ <%$ ConnectionStrings:OracleDB.ProviderName%>

如果您想知道,这就是我的连接字符串的样子

之前

<add 
  name="OracleDB" 
  connectionString="Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=***)(PORT=***)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=***)));User ID=***;Password=***;"
  providerName="System.Data.OracleClient" />

之后:

<add
      name="OracleDB"
      connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=***)(PORT=***))(CONNECT_DATA=(SERVICE_NAME=***)));User Id=***;Password=***;"
      providerName="System.Data.OracleClient" />

答案 5 :(得分:1)

尝试此连接字符串格式:

Provider=msdaora;Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;

查看Oracle db http://www.connectionstrings.com/oracle

的连接字符串示例

答案 6 :(得分:1)

另一个可能的解决方案。

我的webapp在我的测试服务器上运行良好但是当我开始为我的实时服务器开发时,我得到了同样的错误: 无法找到请求的.Net Framework数据提供程序。它可能没有安装

如果您比较下面的两个连接字符串,您会注意到导致我的问题的字符串在提供程序名称中有“Managed”字样。我实际上正在使用Oracle提供程序的非托管版本。因此,我在我的实时服务器上收到错误,而不是在我的测试服务器上。

    **ORIGINAL:**
    connectionString="DATA SOURCE=192.168.10.101:1521/dataconn;PASSWORD=password;PERSIST   SECURITY INFO=True;USER ID=DataConn" providerName="Oracle.ManagedDataAccess.Client"


    **NEW:**
    connectionString="DATA SOURCE=192.168.10.101:1521/dataconn;PASSWORD=password;PERSIST     SECURITY INFO=True;USER ID=DataConn" providerName="Oracle.DataAccess.Client"

答案 7 :(得分:1)

这对我有用。我的服务器已经安装了Oracle客户端。 (版本11.2.0)

  • ODAC for Windows Downloads页面下载ODP.NET托管驱动程序
    (我选择了2015年10月发布,2.43 MB下载)

  • 解压缩zip文件,获取\ lib \ net40 \ Oracle.ManagedDataAccess.dll,并将其放在bin文件夹中。

  • 在web.config中,在this answer中说明的system.data \ DbProviderFactories下添加对ODP.NET托管驱动程序的引用。

那就是它。

要确认,请运行此answer's code以查看是否已安装ODP.NET提供程序。您应该在列表中看到ODP.NET,托管驱动程序。

答案 8 :(得分:0)

我实际下载了ODAC并安装它。然后我添加一个参考,找到了提到的包裹roadrunner71。