sqllite错误:The 'DbProviderFactories'节只能在每个配置文件(IBM Cl

本文关键字:配置文件 Cl IBM 错误 The DbProviderFactories sqllite | 更新日期: 2023-09-27 18:04:06

我在。net 4.5上使用WPF和c#为我的应用程序使用Entity Framework和System.Data.SQLite在我的机器上工作得很好,但是在测试机器上,当我通过EntityFramework访问sqlite db时,我收到了这个错误:

'DbProviderFactories'节只能在每个配置中出现一次文件。

我发现错误是在测试机器中,在machine.config中:

<system.data>
    <DbProviderFactories>
        <add name="IBM DB2 for i5/OS .NET Provider" invariant="IBM.Data.DB2.iSeries" description=".NET Framework Data Provider for i5/OS" type="IBM.Data.DB2.iSeries.iDB2Factory, IBM.Data.DB2.iSeries, Version=12.0.0.0, Culture=neutral, PublicKeyToken=9cdb2ebfb1f93a26"/>
        <add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
        <add name="IBM DB2 for i .NET Provider" invariant="IBM.Data.DB2.iSeries" description=".NET Framework Data Provider for IBM i" type="IBM.Data.DB2.iSeries.iDB2Factory, IBM.Data.DB2.iSeries, Version=12.0.0.0, Culture=neutral, PublicKeyToken=9cdb2ebfb1f93a26" />
    </DbProviderFactories>
    <!-- This is the line to remove - empty element --> 
    <DbProviderFactories/>
</system.data>

我删除了最后一个空元素,现在所有的工作。我想这与IBM.Data.DB2有关。iSeries安装(IBM Client Access).

我的问题是:如何删除空元素没有手动编辑machine.config?我试图在app.config文件中插入标记<clear />,但不工作。

我发现了另一个类似的问题,但没有人建议如何在不手动编辑机器的情况下解决问题。

这是我的应用配置文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <system.xml.serialization>
    <xmlSerializer useLegacySerializerGeneration="true" />
  </system.xml.serialization>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    <!--STAI MOLTO ATTENTO-->
    <legacyUnhandledExceptionPolicy enabled="1"/>
  </startup>
  <connectionStrings>
    <add name="db" connectionString="Data Source=clients.db;Version=3;New=False;Compress=True;" />
    <add name="icmdbEntities" connectionString="metadata=res://*/MainModel.csdl|res://*/MainModel.ssdl|res://*/MainModel.msl;provider=System.Data.SQLite;provider connection string=&quot;data source=.'icmdb.db&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <clear />
      <remove invariant="System.Data.SQLite" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>
  <appSettings>
    <add key="ditta" value="default" />
    <add key="demo" value="true"/>
    <add key="ClientSettingsProvider.ServiceUri" value="" />
  </appSettings>
  <system.web>
    <membership defaultProvider="ClientAuthenticationMembershipProvider">
      <providers>
        <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
      </providers>
    </membership>
    <roleManager defaultProvider="ClientRoleProvider" enabled="true">
      <providers>
        <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
      </providers>
    </roleManager>
  </system.web>
</configuration>

sqllite错误:The 'DbProviderFactories'节只能在每个配置文件(IBM Cl

我今天遇到了这个问题。

machine.config文件位于:

  • C:'Windows'Microsoft.NET'Framework'v2.0.50727'CONFIG'machine.config
  • C:'Windows'Microsoft.NET'Framework'v4.0.30319'Config'machine.config
  • C:'Windows'Microsoft.NET'Framework64'v2.0.50727'CONFIG'machine.config
  • C:'Windows'Microsoft.NET'Framework64'v4.0.30319'Config'machine.config

machine.config的损坏版本包含:

<system.data>
   <DbProviderFactories>
      <add name="IBM DB2 for i .NET Provider" invariant="IBM.Data.DB2.iSeries" description=".NET Framework Data Provider for IBM i" type="IBM.Data.DB2.iSeries.iDB2Factory, IBM.Data.DB2.iSeries, Version=12.0.0.0, Culture=neutral, PublicKeyToken=9cdb2ebfb1f93a26" />
   </DbProviderFactories>
   <DbProviderFactories/>
</system.data>

安装iSeries驱动程序损坏了以下machine.config文件:

| Framework | Platform | Factory Added? | Corrupted Machine.config? |
|-----------|----------|----------------|---------------------------|
|v4.0.30319 |   x64    |     Yes        |   Yes                     |
|v4.0.30319 |   x86    |     Yes        |   Yes                     |
|v2.0.50727 |   x86    |     No         |   No                      |
|v2.0.50727 |   x64    |     No         |   No                      |

很好,你只需要担心IBM破坏一半的machine.config文件;

修复的文件
  • C:'Windows'Microsoft.NET'Framework'v2.0.50727'CONFIG'machine.config (ok)
  • C:'Windows'Microsoft.NET'Framework'v4.0.30319'Config'machine.config (ok)
  • C:'Windows'Microsoft.NET'Framework64'v2.0.50727'CONFIG'machine.config (corrupt)
  • C:'Windows'Microsoft.NET'Framework64'v4.0.30319'Config'machine.config (corrupt)

在记事本中打开两个文件,并删除无关的空<DbProviderFactories/>元素,留下:

<system.data>
   <DbProviderFactories>
      <add name="IBM DB2 for i .NET Provider" invariant="IBM.Data.DB2.iSeries" description=".NET Framework Data Provider for IBM i" type="IBM.Data.DB2.iSeries.iDB2Factory, IBM.Data.DB2.iSeries, Version=12.0.0.0, Culture=neutral, PublicKeyToken=9cdb2ebfb1f93a26" />
   </DbProviderFactories>
</system.data>

这个问题是由安装IBM iAccess for Windows引起的——特别是。net Provider for DB2组件。我在V7R1中亲眼看到了它,但其他人也提到了V6R1的相同问题。

IBM已经意识到这个问题,并在其中一个服务版本中进行了修复。

来自V7R1服务发布文档:

修复了APAR SE45767的问题描述:

在未知情况下,机器损坏。. net数据提供程序在安装时(作为Complete或Custom安装类型的一部分)发生。损坏被隔离到与DbProviderFactories相关的XML数据部分—并且通常观察到包括XML数据的某些行的重复。

APAR SE45767校正:

将提供预防性修复,以消除机器的可能原因。配置腐败。

修复已经损坏的机器。配置文件将不提供。如果可能的话,使用文档中的本地修复或规避。

规避APAR SE45767:

如果不需要。net数据提供程序,则可以通过执行自定义安装并确保不安装。net数据提供程序来避免此问题。如果需要. net提供程序,则不知道如何规避。使用本地修复程序来解决问题。

一旦问题发生就修复,您需要执行fix machine。config(32位和64位),因为它不符合为system.data定义的模式。这很简单——只需编写一个使用XmlDocument加载机器的简单。net应用程序。配置,找到重复的DbProviderFactories元素,删除它并保存文件。或者使用PowerShell脚本或其他任何可以操作XML文档的脚本。

下面是一个IBM APAR在V6R1中讨论这个问题。