在运行时在企业库中更改连接字符串
有没有办法在运行时更改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
- abc.test.com ------>。使用db_ProjectDEF
我使用url-rewrite来解析子域名,并使用子域名来选择它存储在主数据库中的数据库连接字符串。
谢谢
我们可以使用下面的代码片段连接到多个数据库。
DLL文件添加为参考
- Microsoft.Practices.EnterpriseLibrary.Common.dll
- Microsoft.Practices.EnterpriseLibrary.Data.dll
- 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");
子弹和代码不能很好地相互发挥作用,需要一些文本来真正格式化:-) – kleopatra 2014-02-19 07:40:02
很好的解决了我的大问题,谢谢@bentz – 2015-11-24 10:02:33