2012-11-21 37 views
0

我不想修改我的machine.config,但我想使用Npgsql库作为数据提供者。我将部署我的应用程序到多个平台(包括单声道),所以我真的很喜欢“只是工作”,而不是给我错误“无法找到所需的.Net Framework数据提供程序”。有没有办法在运行时动态加载数据提供者?

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

我应该澄清,Npgsql在大多数情况下都不会出现在我的machine.config中,但它有一些不适用于(比如NLog--我当前的挫折感)。

回答

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> 

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

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); 
+0

我会试试这个,谢谢。 –

+0

这似乎没有做任何事情。是否有可能需要重新初始化提供程序工厂列表的另一个命令? –

相关问题