8

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

我也发现了这一点,但它似乎一般适用于.Net,我想知道是否可以专门为 EntLib 做一些事情。

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

提前致谢。

4

4 回答 4

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 解析子域名,并使用子域名选择它存储在主数据库中的数据库连接字符串。

谢谢

于 2011-03-17T02:40:18.210 回答
3

如果您查看“ Enterprise Library Docs - 添加应用程序代码”,它会说:

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

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

于 2008-12-03T11:02:09.293 回答
3

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

要添加为参考的 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");      
于 2014-02-19T07:30:49.347 回答
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");
于 2010-01-08T15:01:33.610 回答