有没有办法在运行时动态加载数据提供程序?

时间:2012-11-21 13:56:57

标签: c# asp.net postgresql dataprovider npgsql

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

有没有办法在运行时“注册”Npgsql作为数据提供者,所以这不会发生?

我应该澄清Npgsql在大多数情况下没有在我的machine.config中工作正常,但是有一些它不能很好地工作(比如NLog--我沮丧的当前来源)。

2 个答案:

答案 0 :(得分: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>

......它开始像冠军一样工作。

答案 1 :(得分: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);