web-dev-qa-db-ja.com

SQLiteエラー:「DbProviderFactories」セクションは、構成ファイルごとに1回だけ表示できます(IBMクライアントアクセス)

アプリケーションにEntityFrameworkとSystem.Data.SQLiteを使用しています。NET4.5でWPFとC#を使用しています。私のマシンでは問題なく動作しますが、テストマシンでは、EntityFrameworkを介してsqlitedbにアクセスすると次のエラーが発生します。

'DbProviderFactories'セクションは、構成ファイルごとに1回だけ表示できます。

エラーは、テストマシンの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を手動で編集せずに?タグを挿入しようとしました<clear /> 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>
10
abrfra

この問題は、IBM iAccess for Windows、特に.NET Provider forDB2コンポーネントのインストールが原因で発生します。私はそれをV7R1で直接見ましたが、他の人はV6R1で同じ問題を参照しています。

IBMはこの問題を認識しており、サービスリリースの1つに修正が加えられています。

V7R1から サービスリリースドキュメント

APAR SE45767で修正された問題の説明:

不明な状況では、.Netデータプロバイダーのインストール時に(CompleteまたはCustomインストールタイプの一部として)machine.configXMLファイルの破損が発生しています。破損は、DbProviderFactoriesに関連するXMLデータの一部に限定されており、一般に、XMLデータの一部の行の重複が含まれていることが確認されています。

APAR SE45767の修正:

Machine.configの破損の考えられる原因を排除する予防策が提供されます。

すでに破損しているmachine.configファイルを更新するための修正修正は提供されません。可能であれば、文書化されたローカル修正または回避策を利用してください。

APAR SE45767の循環:

.Netデータプロバイダーが必要ない場合は、カスタムインストールを実行し、.Netデータプロバイダーがインストールされないようにすることで、この問題を回避できます。 .Netプロバイダーが必要な場合、回避策は不明です。ローカル修正を利用して問題を解決します。

問題が発生した後の修正については、system.dataに定義されているスキーマに準拠していないため、fix machine.config(32ビットと64ビットの両方)を行う必要があります。これは簡単です。XmlDocumentを使用してmachine.configをロードし、重複するDbProviderFactories要素を見つけて削除し、ファイルを保存する単純な.NETアプリを作成するだけです。または、PowerShellスクリプトまたはXMLドキュメントを操作できるその他のものを使用します。

これが この問題について議論しているIBM APAR V6R1です。

10

私は今日この問題を経験しました。

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ファイルの半分を破壊することだけを心配する必要があるのは素晴らしいことです。 .NET4を使用する唯一のアプリケーション。

修正するファイル

  • 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(破損)
  • C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config(破損)

高架のメモ帳から2つのファイルを開き、不要な空の<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>

そして、あなたは修正されました。

24
Ian Boyd