在Enterprise Library中更改运行时的连接字符串

有没有办法在运行时更改Enterprise Library中的DataBase对象的连接字符串? 我找到了这个链接,但它有点过时(2005)

我也发现了这个,但它似乎一般适用于.Net,我想知道是否有一些东西可以专门为EntLib完成。

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

提前致谢。

如果您查看“ 企业库文档 – 添加应用程序代码 ”,它会说:

“如果您知道要创建的数据库的连接字符串,则可以绕过应用程序的配置信息并使用构造函数直接创建Database对象。因为Database类是一个抽象基类,所以必须构造一个派生类派生的数据库类型确定ADO.NET数据提供程序。例如,SqlDatabase类使用SqlClientFactory提供程序,SqlCeDatabase类使用SqlCeProviderFactory提供程序,OracleDatabase类使用OracleClientFactory提供程序。您有责任构造适当的连接字符串的数据库类的类型。“

然后继续举一些例子。 这表明您不应该使用DatabaseFactory,而应该为每个不同的连接创建一个新的Database类。

看看这个: 用一个连接字符串打开Microsoft.practices.EnterpriseLibrary数据库

只需使用以下代码,您就可以在运行时编程创建数据库

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

它解决了我的问题。 我有一个使用很多数据库的web应用程序,根据url中的不同子域连接到不同的数据库。 如:

  • abc.test.com ——>使用Db_projectABC
  • def.test.com ——>使用db_ProjectDEF

我使用url-rewrite来解析子域名,并使用子域名来选择存储在主数据库中的数据库连接字符串。

谢谢

这是杨的网区:

 using Microsoft.Practices.EnterpriseLibrary.Data; using Microsoft.Practices.EnterpriseLibrary.Configuration; using Microsoft.Practices.EnterpriseLibrary.Data.Configuration; DatabaseSettings settings = new DatabaseSettings(); // This maps to  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  element in data config file ConnectionStringData connectionString = new ConnectionStringData("localhost.EntLibQuickStarts"); // Followings map to  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  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  element in App.config file configurations.Add("dataConfiguration", settings); ConfigurationContext context = ConfigurationManager.CreateContext(configurations); Database database = new DatabaseProviderFactory(context).CreateDatabase("localhost"); 

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

要添加的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");