有没有办法在运行时更改Enterprise Library中DataBase对象的连接字符串?我找到了this链接,但它有点过时了(2005)
我也发现this但它似乎一般适用于.Net,我想知道是否有一些东西可以专门用于EntLib。
我只是将连接字符串名称传递给DatabaseFactory对象中的CreateDatabase()方法,直到昨天我的项目经理要求我支持多个数据库实例。碰巧我们必须为每个状态设置一个数据库(一个用于CA,一个用于FL等),因此我的软件需要循环遍历所有数据库并对数据执行某些操作,但它将使用相同的配置文件。
提前致谢。
答案 0 :(得分:14)
看看这个:Open Microsoft.practices.EnterpriseLibrary database with just a connection string
只需使用以下代码,您就可以在运行时编程创建数据库
database mydb = new EnterpriseLibrary.Data.Sql.SqlDatabase("connection string here");
它解决了我的问题。 我有一个使用很多数据库的web应用程序,根据url中的不同子域连接到不同的数据库。 如:
我使用url-rewrite来解析子域名,并使用子域名来选择存储在主数据库中的数据库连接字符串。
由于
答案 1 :(得分:3)
如果你看看“Enterprise Library Docs - Adding Application Code” 它说:
“如果您知道连接字符串 您要创建的数据库 可以绕过应用程序 配置信息并使用一个 构造函数直接创建 数据库对象。因为数据库 class是一个抽象基类,你 必须构建一个派生的 类型。派生的数据库类型 确定ADO.NET数据提供程序。 例如,SqlDatabase类 使用SqlClientFactory提供程序, SqlCeDatabase类使用 SqlCeProviderFactory提供程序,和 OracleDatabase类使用 OracleClientFactory提供程序。它是 你有责任建造 适当类型的数据库类 连接字符串。“
接下来举一些例子。这表明您不应该使用DatabaseFactory,而应该为每个不同的连接创建一个新的Database类。
答案 2 :(得分:3)
我们可以使用以下代码段连接到多个数据库。
要添加为参考的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");
答案 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");