Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQLite错误';DBProviderFactorys&x27;节只能在每个配置文件中显示一次(IBM客户端访问)_C#_Wpf_Entity Framework_Sqlite - Fatal编程技术网

C# SQLite错误';DBProviderFactorys&x27;节只能在每个配置文件中显示一次(IBM客户端访问)

C# SQLite错误';DBProviderFactorys&x27;节只能在每个配置文件中显示一次(IBM客户端访问),c#,wpf,entity-framework,sqlite,C#,Wpf,Entity Framework,Sqlite,我正在为我的应用程序实体框架和System.Data.SQLite使用.NET 4.5上的WPF和C 在我的机器上,al工作正常,但在测试机器上,当我通过EntityFramework访问sqlite db时,a收到此错误: “DbProviderFactorys”部分在每个配置中只能出现一次 文件 我发现错误是在测试机器的machine.config中: <system.data> <DbProviderFactories> <add na

我正在为我的应用程序实体框架和System.Data.SQLite使用.NET 4.5上的WPF和C 在我的机器上,al工作正常,但在测试机器上,当我通过EntityFramework访问sqlite db时,a收到此错误:

“DbProviderFactorys”部分在每个配置中只能出现一次 文件

我发现错误是在测试机器的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客户端访问)有关

我的问题是: 如何在不手动编辑machine.config的情况下删除空元素?我已尝试在app.config文件中插入标记
,但无效

我发现了另一个与我类似的问题,但没有一个建议如何在不手动编辑machine.config的情况下解决问题

这是我的app.config文件:

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

问题是由安装IBM iAccess for Windows引起的,特别是用于DB2组件的.NET提供程序。我在V7R1中亲眼目睹了这一点,但其他人在V6R1中也提到了同样的问题

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

从V7R1:

针对APAR SE45767修复的问题说明: 在未知情况下,安装.Net数据提供程序(作为完整安装类型或自定义安装类型的一部分)时,machine.config XML文件会发生损坏。损坏被隔离到与DbProviderFactorys相关的XML数据部分,并且通常被观察到包括XML数据的某些行的重复

APAR SE45767的更正: 将提供预防性修复程序,以消除machine.config损坏的可能原因

将不提供更新已损坏的machine.config文件的修复程序。如果可能,利用记录在案的本地修复或规避

针对APAR SE45767的规避: 如果不需要.Net数据提供程序,则可以通过执行自定义安装并确保不安装.Net数据提供程序来避免此问题。如果需要.Net提供程序,则不存在已知的规避。利用本地修复程序解决问题

至于在问题发生后修复问题,您需要修复machine.config(32位和64位),因为它不符合为system.data定义的架构。这很简单——只需编写一个简单的.NET应用程序,使用XmlDocument加载machine.config,找到重复的DbProviderFactorys元素,删除它并保存文件。或者使用PowerShell脚本或任何其他可以操作XML文档的东西


这是V6R1中的一个问题。

我今天遇到了这个问题

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>
很好,您只需担心IBM会损坏您的
machine.config
文件的一半;而只有那些使用.NET4的应用程序

要修复的文件
  • 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
    (已损坏)
从提升的记事本中,打开这两个文件,然后删除多余的空
元素,留下:

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


你已经修好了。

没错,但我的问题是“不用手工编辑机器配置文件就修好了…”我知道,@abrfra。但我有问题,我需要解决它。我花了一段时间才找到
machine.config
文件的位置。所以我想记录下我的发现,让下一个可怜的灵魂来探访这个问题。这个问题是互联网上唯一记录错误的地方。下一个可怜的人可能是我!我也有同样的错误,但损坏的文件是v4.0.30319节点下的文件。尝试了提议的解决方案,它成功了!非常感谢。
<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>