【问题标题】:Unable to find the requested .Net Framework Data Provider. It may not be installed找不到请求的 .Net Framework 数据提供程序。它可能没有安装
【发布时间】:2014-02-05 01:57:40
【问题描述】:

您好,这是我第一次在远程服务器上发布使用实体框架开发的项目。页面工作正常,但是当我尝试访问我的保留区域时,读取数据库时,我收到此错误

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

说明:在执行当前网络请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ArgumentException:找不到请求的 .Net Framework 数据提供程序。可能没有安装。

来源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[ArgumentException: 无法找到请求的 .Net Framework 数据 提供者。它可能没有安装。]
System.Data.Common.DbProviderFactories.GetFactory(字符串 providerInvariantName) +1402071
System.Data.EntityClient.EntityConnection.GetFactory(字符串 providerString) +35

[ArgumentException: 找不到指定的商店提供程序 配置,或无效。]
System.Data.EntityClient.EntityConnection.GetFactory(字符串 提供者字符串)+62
System.Data.EntityClient.EntityConnection.ChangeConnectionString(字符串 新连接字符串)+263
System.Data.EntityClient.EntityConnection..ctor(字符串 连接字符串)+81
System.Data.Objects.ObjectContext.CreateEntityConnection(字符串 连接字符串)+42
System.Data.Objects.ObjectContext..ctor(字符串连接字符串, 字符串 defaultContainerName) +16
shield_trust.db_shieldtrustEntities..ctor() 在 D:\trust-company\shield_trust\shield_trust\POCO.Context.cs:23
shield_trust.user_login.check_login() 在 D:\trust-company\shield_trust\shield_trust\user_login.aspx.cs:65
shield_trust.user_login.entraButton_Click(对象发送者,EventArgs e) 在 D:\trust-company\shield_trust\shield_trust\user_login.aspx.cs:25
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +118
System.Web.UI.WebControls.Button.RaisePostBackEvent(字符串 事件参数)+112
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串 eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl,字符串 eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36 System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint) +5563

我必须将一些 dll 复制到我的 bin 文件夹中或修改我的 web.config?

【问题讨论】:

  • 检查这个post,它刚刚对我有用!

标签: c# asp.net .net entity-framework


【解决方案1】:

尝试运行此程序以获取已安装提供程序的列表,并检查您的是否存在:

// This example assumes a reference to System.Data.Common.
static DataTable GetProviderFactoryClasses()
{
    // Retrieve the installed providers and factories.
    DataTable table = DbProviderFactories.GetFactoryClasses();

    // Display each row and column value.
    foreach (DataRow row in table.Rows)
    {
        foreach (DataColumn column in table.Columns)
        {
            Console.WriteLine(row[column]);
        }
    }
    return table;
}

更新:您需要在目标机器上安装 MySQL Provider,它被称为“MySQL Connector Net x.x.x”,您可以从 this website 获得它

【讨论】:

  • 但是这台机器是托管的远程机器,我什么都安装不了。我尝试将 MySql.Data.dll、MySql.Data.Entity.dll 和 MySql.Web.dll 文件复制到我的 bin 远程文件夹中,但我不工作
  • 您已将它们复制到您的 bin 中,但您是否在项目中引用了它们?
  • 不,我没有在我的项目中引用,因为我不知道我必须这样做。当我将这项工作上传到另一台机器时,一切都没有做任何事情。我在这个新主机上遇到的问题
  • 另一台机器上可能有 mysql 连接器...添加对 DLL 的引用并重试。
  • 添加对“右键”项目名称的引用->引用路径->文件夹和我添加3个dll?
【解决方案2】:

对于我们的应用程序(ASP.NET、测试、Windows 服务),我们必须将以下内容添加到我们的 app.config 或 web.config 文件(在 configuration 节点内)以使其工作:

<system.data>
        <DbProviderFactories>
            <remove invariant="MySql.Data.MySqlClient" />
            <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
        </DbProviderFactories>
    </system.data>

【讨论】:

  • 我从 Windows 控制面板卸载了 .NET 连接器(无论版本)。然后,我将此配置放入我的 web.config 并再次运行该网站,它已修复。谢谢!它起作用的原因是,我强制 IIS 在 bin 文件夹中使用我的 dll,并且不使用其他任何库(实际上没有其他地方,因为我已经从我的机器上卸载了连接器,唯一剩下的就是web 应用 bin 文件夹。
【解决方案3】:

如果收到如下对话框...

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

在以下位置查看 machine.config 文件...

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

删除所有空白

"DbProviderFactories" nodes.

【讨论】:

  • 它对我有用:我在 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config 中注释掉了 DbProviderFactories
【解决方案4】:

对我们来说,这是 32 位与 64 位的进程。 服务器是 64 位的。 安装的 ODP.NET(Oracle 客户端)也是 64 位的。 我们的应用程序使用目标平台“任何 CPU”和“首选 32 位”标志 SET 编译:

http://grab.by/v5ki

作为 32 位进程运行。 一旦使用未选中的标志重新编译,一切都开始工作了。

【讨论】:

    【解决方案5】:

    我知道这是旧的,但正如 udog 所解释的,这部分错误消息“在配置中找不到指定的商店提供程序,或者无效”表明了问题所在。因此,根据后端数据库将提供程序信息添加到配置文件中。如果已经添加,请确保它是正确的。对于 oracle,如果使用 EF 和 oracle.DataAccess 的托管提供程序,它将看起来像这样。请注意,您的 oracle dll 版本可能不同。

    <system.data>
       <DbProviderFactories>
           <remove invariant="Oracle.MaanagedDataAccess.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.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>  
       <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"/>
       </DbProviderFactories>
    </system.data>
    

    【讨论】:

    • 我实际上在使用 Oracle,所以这正是我想要的。
    【解决方案6】:

    尴尬的是,我花了三天时间试图解决这个错误。我的“connectionString”上有一个不正确的“providerName”属性

    更改自:

    <configuration>
        <connectionStrings>
            <add name="Old" connectionString="Server=servername;Database=databasename;Uid=userid;Pwd=password;" providerName="System.Data.MySqlClient" />
        </connectionStrings>
    </configuration>
    

    到:

    <configuration>
        <connectionStrings>
            <add name="Old" connectionString="Server=servername;Database=databasename;Uid=userid;Pwd=password;" providerName="MySql.Data.MySqlClient" />
        </connectionStrings>
    </configuration>
    

    我指定了System.Data.MySqlClient 而不是Mysql.Data.MySqlClient

    哦!

    【讨论】:

    • 对于任何关心的人,检查拼写错误(即使它已经在版本控制中)。感谢您的提示。
    【解决方案7】:

    当连接到数据库时,所谓的“数据提供者”用于实现的抽象。

    您的异常似乎是说目标计算机上不存在给定的数据提供程序。您在部署的环境中使用哪个数据库?检查您的 web.config 连接字符串以获取详细信息。

    您可能必须自己在该机器上安装给定的数据提供程序(一次),以便从全局程序集缓存 (GAC) 中获得它。

    【讨论】:

    • 我用的是MySql数据库
    【解决方案8】:

    添加到 Web.config 中的语句帮助了我。

    <system.data>
            <DbProviderFactories>
                <clear />
                <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
            </DbProviderFactories>
        </system.data>
    

    【讨论】:

      【解决方案9】:

      为了进一步构建 udog 的答案,如果您要在服务器上使用此数据提供程序的多个应用程序,那么将其添加到 machine.config 文件中可能更有意义。

      正如 Thomas 所说,machine.config 文件位于此处:

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

      machine.config 条目类似于 web.config 条目:

      <system.data>
          <DbProviderFactories>
              <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
          </DbProviderFactories>
      </system.data>
      

      注意:如果您的应用程序位于多台服务器上(例如 QA/测试服务器和生产服务器),而您只在其中一台服务器上遇到此错误,我建议您在 machine.config 文件之间创建一个文件差异以看看服务器之间是否存在差异。

      【讨论】:

        【解决方案10】:

        我在我的个人电脑上尝试安装独立工具时遇到了同样的错误。我做了以下步骤.NET Framework 2.0 和 3.0).NET Framework 4.7 高级服务被重新安装但没有解决问题,在我最终使用这个简单的修复程序之前。 下载并安装 SSCERuntime_x64-ENU.exe 点击此链接下载https://www.microsoft.com/en-us/download/details.aspx?id=30709 祝你好运。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-24
          • 2014-07-14
          相关资源
          最近更新 更多