无法找到所需的.NET Framework数据提供程序,可能未安装。

17

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

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

描述:当前 Web 请求执行过程中发生了一个未处理的异常。请查看堆栈跟踪以获取有关错误和代码中起源位置的更多信息。

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

Source Error:

当前 Web 请求执行期间生成了一个未处理的异常。可以使用下面的异常堆栈跟踪来确定异常源和位置。

堆栈跟踪:

[ArgumentException: 无法找到请求的 .Net Framework 数据提供程序。可能未安装。]
System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName) +1402071
System.Data.EntityClient.EntityConnection.GetFactory(String providerString) +35

[ArgumentException: 在配置中找不到指定的存储提供程序,或者无效。]
System.Data.EntityClient.EntityConnection.GetFactory(String providerString) +62
System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString) +263
System.Data.EntityClient.EntityConnection..ctor(String connectionString) +81
System.Data.Objects.ObjectContext.CreateEntityConnection(String connectionString) +42
System.Data.Objects.ObjectContext..ctor(String connectionString, String defaultContainerName) +16
shield_trust.db_shieldtrustEntities..ctor() in D:\trust-company\shield_trust\shield_trust\POCO.Context.cs:23
shield_trust.user_login.check_login() in D:\trust-company\shield_trust\shield_trust\user_login.aspx.cs:65
shield_trust.user_login.entraButton_Click(Object sender, 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(String eventArgument) +112
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563

我需要将某些dll复制到我的bin文件夹中或修改我的web.config文件吗?


请查看此帖子,它刚刚为我解决了问题! - Eduardo A. Fernández Díaz
10个回答

17
尝试运行以下命令以获取已安装提供程序的列表,并检查您的提供程序是否在其中:
// 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”的东西,您可以从此网站获取。

更新于2022年9月6日:由于这仍然是作为答案考虑的问题,我想指出Nuget包几乎是一个行业标准。因此,对于较新的非遗留应用程序,我建议查看MySqlConnector Nuget包,该包目前受到支持,并且最近于2022年6月5日进行了更新。有关更多信息,请参见mysqlconnector.net


1
但是这台机器是托管的远程机器,我无法安装任何东西。我尝试将 MySql.Data.dll、MySql.Data.Entity.dll 和 MySql.Web.dll 文件复制到我的远程 bin 文件夹中,但它没有起作用。 - P_R
如何将“right button”项目名称添加为引用 -> 引用路径 -> 文件夹,然后我再添加 3 个 DLL? - P_R
在项目中右键单击引用文件夹,然后选择添加引用,浏览并添加这三个DLL文件。 - Paul Zahra
是的,这是可能的,它们必须位于目标计算机的全局程序集缓存中。尽管连接器Net 6.6发行说明中提到“增强了部分信任支持,使得托管服务能够在不安装Connector/Net库到全局程序集缓存的情况下部署应用程序”。 - Paul Zahra
尝试在目标机器上运行上述代码,目标机器可能安装了旧版本,值得检查。 - Paul Zahra
显示剩余11条评论

11

我们的应用程序(ASP.NET,Test,Windows Service)需要在 configuration 节点内的 app.config 或 web.config 文件中添加以下内容才能正常工作:

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

1
我从Windows控制面板中卸载了.NET连接器(无论哪个版本)。然后,我将此配置放入我的web.config文件中,并再次运行网站,问题得到解决。原因是我强制IIS使用我的bin文件夹中的dll,而不使用其他任何库(实际上没有其他地方可用,因为我已经从计算机中卸载了连接器,唯一剩下的就是Web应用程序bin文件夹中的dll)。谢谢! - Quan

6
如果你看到以下对话框...
"未能找到所请求的.NET Framework数据提供程序。可能未安装"
请查看以下位置的 machine.config 文件...
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config

删除任何空的元素

"DbProviderFactories" nodes.

它对我有效:我在以下位置的machine.config文件中注释掉了DbProviderFactories:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config - profimedica

4

对我们来说,这是32位与64位进程的问题。 服务器是64位的。 安装的ODP.NET (Oracle客户端)也是64位的。 我们的应用程序使用目标平台"Any CPU"和"Prefer 32-bit"标志进行编译:

http://grab.by/v5ki

原本以32位进程运行。 取消勾选标志后,重新编译一切正常。


3
尴尬的是,我花了三天时间来解决这个错误。我的“connectionString”上有一个不正确的“providerName”属性。
更改前:
<configuration>
    <connectionStrings>
        <add name="Old" connectionString="Server=servername;Database=databasename;Uid=userid;Pwd=password;" providerName="System.Data.MySqlClient" />
    </connectionStrings>
</configuration>

to:

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

1
对于任何关心的人,请检查拼写错误(即使已经在版本控制中)。感谢您的提示。 - Fabio Milheiro

3

我知道这已经比较老了,但是正如udog所解释的那样,错误消息中的这个部分“The specified store provider cannot be found in the configuration, or is not valid”指出了问题所在。根据后端数据库的不同,在配置文件中添加提供程序信息。如果已经添加,请确保它是正确的。对于使用EF和oracle.DataAccess的托管提供程序的Oracle,它将类似于这样。请注意,您的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,所以这正是我在寻找的。 - Roger Perkins

1
连接数据库时,使用所谓的“数据提供程序”来抽象实现。您的异常似乎表明目标机器上没有提供给定的数据提供程序。在部署环境中使用哪个数据库?检查web.config连接字符串以获取具体信息。您可能需要在该计算机上自己安装给定的数据提供程序(一次),以便它可从全局程序集缓存(GAC)中使用。

我使用了一个 MySql 数据库。 - P_R

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

0
进一步建立在udog的答案上,如果您打算在服务器上使用这个数据提供程序运行多个应用程序,那么将其添加到machine.config文件中可能更有意义。
正如Thomas所指出的,machine.config文件位于此处:
C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config
与web.config条目类似,machine.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 文件之间进行文件比较,以查看服务器之间是否存在差异。

0
我在尝试在个人电脑上安装独立工具时遇到了同样的错误。我按照以下步骤进行操作:重新安装.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 祝好运。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接