2008-11-28 86 views
8

有沒有辦法在運行時更改Enterprise Library中的DataBase對象的連接字符串?我發現this鏈接,但它的一點點過時(2005)在運行時在企業庫中更改連接字符串

我也發現this但它似乎適用於.Net在一般情況下,我想知道是否有什麼可以專門爲EntLib 。

我只是將連接字符串名稱傳遞給DatabaseFactory對象中的CreateDatabase()方法,直到昨天我的項目經理要求我支持多個數據庫實例。恰巧我們必須爲每個狀態(一個用於CA,一個用於FL等等)擁有一個數據庫,所以我的軟件需要遍歷所有數據庫並對數據執行某些操作,但它將使用相同的配置文件。

在此先感謝。

回答

3

如果你看一看「Enterprise Library Docs - Adding Application Code」 它這樣說:

「如果你知道 連接字符串,你要創建的數據庫,你 可以繞過應用程序的 配置信息和使用 構造函數直接創建數據庫對象 由於數據庫類是抽象基類,因此您的 必須構造其派生的 類型中的一個類型派生的數據庫類型 決定了ADO.NET數據提供者。 例如,SqlDatabase類 使用SqlClientFactory提供商, 的SqlCeDatabase類使用 SqlCeProviderFactory提供商,並且 Oracle數據庫類使用 OracleClientFactory提供商。這是 你的責任,構建 適當類型的數據庫類爲 連接字符串。」

然後接着舉一些例子。這表明,你不應該使用DatabaseFactory,你應該對於每個不同的連接創建一個新的數據庫類

2

從楊的淨區這裏是:

using Microsoft.Practices.EnterpriseLibrary.Data; 
using Microsoft.Practices.EnterpriseLibrary.Configuration; 
using Microsoft.Practices.EnterpriseLibrary.Data.Configuration; 

DatabaseSettings settings = new DatabaseSettings(); 

// This maps to <databaseType> element in data config file 
DatabaseTypeData type = new DatabaseTypeData("Sql Server", "Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase, Microsoft.Practices.EnterpriseLibrary.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); 
settings.DatabaseTypes.Add(type); 

// This maps to <connectionString> element in data config file 
ConnectionStringData connectionString = new ConnectionStringData("localhost.EntLibQuickStarts"); 

// Followings map to <parameter> elements in data config file 
ParameterData param = new ParameterData("server", "localhost"); 
connectionString.Parameters.Add(param); 

param = new ParameterData("database", "EntLibQuickStarts"); 
connectionString.Parameters.Add(param); 

param = new ParameterData("integrated security", "true"); 
connectionString.Parameters.Add(param); 

settings.ConnectionStrings.Add(connectionString); 

// Too bad compiler gets confused InstanceData with System.Diagnostics.InstanceData. It maps to <instance> element in data config file 
Microsoft.Practices.EnterpriseLibrary.Data.Configuration.InstanceData instance = new Microsoft.Practices.EnterpriseLibrary.Data.Configuration.InstanceData("localhost", "Sql Server", "localhost.EntLibQuickStarts"); 
settings.Instances.Add(instance); 

ConfigurationDictionary configurations = new ConfigurationDictionary(); 

// This is how to tie DatabaseSettings with ConfigurationDictionary. It maps to <configurationSection name="dataConfiguration"> element in App.config file configurations.Add("dataConfiguration", settings); 
ConfigurationContext context = ConfigurationManager.CreateContext(configurations); 

Database database = new DatabaseProviderFactory(context).CreateDatabase("localhost"); 
13

看看這個:Open Microsoft.practices.EnterpriseLibrary database with just a connection string

只是用這個跟蹤代碼,您可以編程在運行時

database mydb = new EnterpriseLibrary.Data.Sql.SqlDatabase("connection string here"); 

它解決了我的問題建立數據庫。 我有一個單一的網絡應用程序使用許多數據庫,根據url中不同的子域來連接到不同的數據庫。 如:使用Db_projectABC

  • def.test

    • abc.test.com ------>。使用db_ProjectDEF

    我使用url-rewrite來解析子域名,並使用子域名來選擇它存儲在主數據庫中的數據庫連接字符串。

    謝謝

  • +0

    很好的解決了我的大問題,謝謝@bentz – 2015-11-24 10:02:33

    1

    我們可以使用下面的代碼片段連接到多個數據庫。

    DLL文件添加爲參考

    1. Microsoft.Practices.EnterpriseLibrary.Common.dll
    2. Microsoft.Practices.EnterpriseLibrary.Data.dll
    3. Microsoft.Practices.ServiceLocation.dll

    片段:

    var builder = new ConfigurationSourceBuilder(); 
    
         builder.ConfigureData() 
           .ForDatabaseNamed("LocalSqlServer1") 
           .ThatIs.ASqlDatabase() 
           .WithConnectionString(@"Data Source=PCNAME\SQLEXPRESS;Initial Catalog=ContactDB;Integrated Security=True") 
           .ForDatabaseNamed("LocalSqlServer2") 
           .ThatIs.ASqlDatabase() 
           .WithConnectionString(@"Data Source=PCNAME\SQLEXPRESS;Initial Catalog=MyDB;Integrated Security=True"); 
    
         var configSource = new DictionaryConfigurationSource(); 
         builder.UpdateConfigurationWithReplace(configSource); 
    
    Microsoft.Practices.EnterpriseLibrary.Common.Configuration.EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource);  
    
    Database destinationDatabase = DatabaseFactory.CreateDatabase("LocalSqlServer2");  
    
    +1

    子彈和代碼不能很好地相互發揮作用,需要一些文本來真正格式化:-) – kleopatra 2014-02-19 07:40:02

    相關問題