在运行时在企业库中更改连接字符串

问题描述:

有没有办法在运行时更改Enterprise Library中的DataBase对象的连接字符串?我发现this链接,但它的一点点过时(2005)在运行时在企业库中更改连接字符串

我也发现this但它似乎适用于.Net在一般情况下,我想知道是否有什么可以专门为EntLib 。

我只是将连接字符串名称传递给DatabaseFactory对象中的CreateDatabase()方法,直到昨天我的项目经理要求我支持多个数据库实例。恰巧我们必须为每个状态(一个用于CA,一个用于FL等等)拥有一个数据库,所以我的软件需要遍历所有数据库并对数据执行某些操作,但它将使用相同的配置文件。

在此先感谢。

如果你看一看“Enterprise Library Docs - Adding Application Code” 它这样说:

“如果你知道 连接字符串,你要创建的数据库,你 可以绕过应用程序的 配置信息和使用 构造函数直接创建数据库对象 由于数据库类是抽象基类,因此您的 必须构造其派生的 类型中的一个类型派生的数据库类型 决定了ADO.NET数据提供者。 例如,SqlDatabase类 使用SqlClientFactory提供商, 的SqlCeDatabase类使用 SqlCeProviderFactory提供商,并且 Oracle数据库类使用 OracleClientFactory提供商。这是 你的责任,构建 适当类型的数据库类为 连接字符串。”

然后接着举一些例子。这表明,你不应该使用DatabaseFactory,你应该对于每个不同的连接创建一个新的数据库类

从杨的净区这里是:

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"); 

看看这个: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

    我们可以使用下面的代码片段连接到多个数据库。

    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