0

machine.config を変更したくありませんが、Npgsql ライブラリをデータ プロバイダーとして使用したいと考えています。アプリケーションを複数のプラットフォーム (mono を含む) にデプロイするので、「要求された .Net Framework Data Provider が見つかりません」というエラーが表示されるのではなく、「正常に動作する」ようにしたいと考えています。

これが起こらないように、実行時にNpgsqlをデータプロバイダーとして「登録」する方法はありますか?

ほとんどの場合、Npgsql が私の machine.config になくても正常に動作することを明確にする必要がありますが、うまく動作しないものもあります (NLog のように、現在のフラストレーションの原因です)。

4

2 に答える 2

5

必要なことを行う方法を見つけました。それは完全に「実行時」ではありませんが、十分に近く、machine.config を変更する必要はありませんでした。このセクションを web.config ファイルに追加しました。

<system.data>
    <DbProviderFactories>
        <add name="Npgsql Data Provider" invariant="Npgsql" description=".NET Framework Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" />
    </DbProviderFactories>
</system.data>

...そして、チャンピオンのように機能し始めました。

于 2012-11-29T12:24:12.053 に答える
0

Reflectionを使用する必要があります(コードはMicrosoft .NET Framework用であるため、Monoでプライベートフィールドが同じかどうかを確認する必要があります)。

using System.Data.Common;

// 1. Initialize the default configuration
DbProviderFactories.GetFactoryClasses();

// 2. Retrieve the configuration table.
var config = (DataTable)typeof(DbProviderFactories).GetField("_providerTable", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null);

// 3. Add a new entry in the configuration (replace the values with ones for your provider).
DataRow dataRow = config.NewRow();
dataRow["Name"] = "SqlClient Data Provider";
dataRow["InvariantName"] = typeof(SqlConnection).Namespace.ToString();
dataRow["Description"] = ".Net Framework Data Provider for SqlServer";
dataRow["AssemblyQualifiedName"] = typeof(SqlConnection).AssemblyQualifiedName;
config.Rows.Add(dataRow);
于 2012-11-21T14:36:04.747 に答える