2012-11-21 40 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

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

相關問題