0

我不想修改我的 machine.config,但我想使用 Npgsql 库作为数据提供者。我会将我的应用程序部署到多个平台(包括单声道),所以我真的希望它“正常工作”而不是给我错误“无法找到请求的 .Net Framework 数据提供程序”。

有没有办法在运行时将 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

您将不得不求助于使用反射(代码适用于 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 回答