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

时间:2008-11-28 18:18:02

标签: c# .net database configuration enterprise-library

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

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

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

提前致谢。

4 个答案:

答案 0 :(得分:14)

看看这个:Open Microsoft.practices.EnterpriseLibrary database with just a connection string

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

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

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

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

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

由于

答案 1 :(得分:3)

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

  

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

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

答案 2 :(得分:3)

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

要添加为参考的DLL

  1. Microsoft.Practices.EnterpriseLibrary.Common.dll
  2. Microsoft.Practices.EnterpriseLibrary.Data.dll
  3. Microsoft.Practices.ServiceLocation.dll
  4. 摘录:

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

答案 3 :(得分: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");