3

最近、クライアント マシンで次のエラーが発生しました。

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

マシン構成に重複した 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>
    <DbProviderFactories />
</system.data>

この余分な要素を手動で削除すると問題が解決し、ソフトウェアを実行できるようになります。ただし、独自の app.config 内の重複したエントリをおそらく無視することで、これを回避するように試みることが求められています。これは、多くのクライアントが同じ問題を抱えている可能性があり、全員の構成ファイルを変更できないためです。

system.data セクション内に要素を追加して<clear/>、machine.config に既にあるものを上書きしようとしました。ただし、これは機能しません。

例えば

<system.data>
    <clear />
    <DbProviderFactories>
      <add name="Microsoft SQL Server Compact Data Provider 4.0" 
           invariant="System.Data.SqlServerCe.4.0" 
           description=".NET Framework Data Provider for Microsoft SQL Server Compact" 
           type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
    </DbProviderFactories>
  </system.data>

重複する DbProviderFactories 要素をプログラムで無視する方法はありますか?

マシン構成を変更できる API はありますか?

誰かが解決策を助けたり、推奨したりできますか?

敬具

4

3 に答える 3

4

最近、Entity Framework で SqlServerCe を使用しようとしているときに、この同じ問題に遭遇しました。

Entity Framework 6 で利用可能なコードベースの構成機能を使用して、この問題を回避することができました。

あなたがする必要があるのは、あなたから タグ<entityframeowrk><system.data>タグを削除app.configし、プロジェクトに次のようなクラスを含めることだけです:

using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.SqlServerCompact;
using System.Data.SqlServerCe;

namespace Data
{
    public class DatabaseConfiguration : DbConfiguration
    {
        public DatabaseConfiguration()
        {
            SetExecutionStrategy("System.Data.SqlServerCe.4.0", () => new DefaultExecutionStrategy());
            SetProviderFactory("System.Data.SqlServerCe.4.0", new SqlCeProviderFactory());
            SetProviderServices("System.Data.SqlServerCe.4.0", SqlCeProviderServices.Instance);
        }
    }
}

エンティティ フレームワークは、これを自動的に取得して使用します。の設定は、app.configこのクラスに表示されるものをすべて上書きすることに注意してください。

また、このクラスをデータ レイヤーに含めたくない場合は、DbConfiguration の移動セクションを参照してください

于 2014-04-17T10:24:47.817 に答える
1

同じ問題に遭遇しましたが、IBM DB2 ドライバーが原因のようです。

重複したエントリを無視できるとは思いません。エラーはアプリケーションによって発生したのではなく、machine.config読み取り時に検証に失敗した .NET フレームワークによって発生したものです。

検証が失敗し、構成が読み込まれないため、どの種類の API からも構成を操作できません。

最良の方法は、データ プロバイダーを使用しない単純なコンソール アプリケーションを作成し、単純な XML 操作によって構成ファイルを解析および修正することです。データプロバイダーを使用するアプリケーションのみが例外をトリガーすることを正しく思い出せば、それを行うことができるはずです。そうでない場合は、anser を更新できるようにお知らせください。

于 2014-03-17T08:52:36.007 に答える
0

@Albireo が述べたように、この問題は IBM iAccess for Windows、具体的には .NET Provider for DB2 コンポーネントをインストールすることによって発生します。私は V7R1 で直接見ましたが、他の人は V6R1 で同じ問題を参照しています。

IBM はこの問題を認識しており、いずれかのサービス リリースで修正を行います。

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

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

不明な状況下で、(完全またはカスタム インストール タイプの一部として) .Net データ プロバイダーをインストールすると、machine.config XML ファイルが破損します。破損は、DbProviderFactories に関連する XML データの部分に分離されており、通常、XML データのいくつかの行の重複が含まれていることが確認されています。

APAR SE45767 の訂正:

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

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

APAR SE45767 の回避策:

.Net データ プロバイダーが必要ない場合は、カスタム インストールを実行し、.Net データ プロバイダーがインストールされないようにすることで、この問題を回避できます。.Net プロバイダーが必要な場合、回避策は知られていません。ローカル フィックスを使用して問題を解決してください。

于 2014-06-17T21:46:19.803 に答える