C# 在企业库中运行时更改连接字符串

C# 在企业库中运行时更改连接字符串,c#,.net,database,configuration,enterprise-library,C#,.net,Database,Configuration,Enterprise Library,是否有方法在运行时更改企业库中数据库对象的连接字符串?我找到了链接,但它有点过时(2005年) 我也发现了,但它似乎适用于.Net,我想知道是否有什么东西可以专门为EntLib做 我只是将连接字符串名称传递给DatabaseFactory对象中的CreateDatabase()方法,直到昨天我的项目经理要求我支持多个数据库实例时,这种方法才起作用。碰巧我们每个州必须有一个数据库(一个用于CA,一个用于FL,等等),所以我的软件需要在所有数据库中循环并处理数据,但它将使用相同的配置文件 提前感谢。

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

我也发现了,但它似乎适用于.Net,我想知道是否有什么东西可以专门为EntLib做

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

提前感谢。

如果您查看“” 上面说:

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


然后给出一些例子。这表明您不应该使用DatabaseFactory,而应该为每个不同的连接创建一个新的数据库类。

以下是Yang's Net Zone的内容:

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");
使用Microsoft.Practices.EnterpriseLibrary.Data;
使用Microsoft.Practices.EnterpriseLibrary.Configuration;
使用Microsoft.Practices.EnterpriseLibrary.Data.Configuration;
DatabaseSettings=新的DatabaseSettings();
//这映射到数据配置文件中的元素
DatabaseTypeData type=new DatabaseTypeData(“Sql Server”、“Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase、Microsoft.Practices.EnterpriseLibrary.Data,版本=1.0.0.0,区域性=中性,PublicKeyToken=null”);
设置。数据库类型。添加(类型);
//这映射到数据配置文件中的元素
ConnectionStringData connectionString=新的ConnectionStringData(“localhost.EntLibQuickStarts”);
//以下映射到数据配置文件中的元素
ParameterData param=新的ParameterData(“服务器”、“本地主机”);
connectionString.Parameters.Add(参数);
param=新参数数据(“数据库”、“EntLibQuickStarts”);
connectionString.Parameters.Add(参数);
param=新参数数据(“集成安全性”、“真”);
connectionString.Parameters.Add(参数);
settings.connectionString.Add(connectionString);
//太糟糕了,编译器将InstanceData与System.Diagnostics.InstanceData混淆。它映射到数据配置文件中的元素
Microsoft.Practices.EnterpriseLibrary.Data.Configuration.InstanceData实例=新的Microsoft.Practices.EnterpriseLibrary.Data.Configuration.InstanceData(“localhost”、“Sql Server”、“localhost.EntLibQuickStarts”);
settings.Instances.Add(实例);
ConfigurationDictionary配置=新建ConfigurationDictionary();
//这是如何将数据库设置与ConfigurationDictionary联系起来的。它映射到App.config文件configurations.Add(“dataConfiguration”,settings)中的元素;
ConfigurationContext=ConfigurationManager.CreateContext(配置);
Database Database=新建DatabaseProviderFactory(上下文).CreateDatabase(“localhost”);
看看这个:

只要使用下面的代码,就可以在运行时创建数据库

database mydb = new EnterpriseLibrary.Data.Sql.SqlDatabase("connection string here");
它解决了我的问题。 我有一个单一的web应用程序使用多个数据库,根据url中的不同子域连接到不同的数据库。 例如:

  • abc.test.com----->使用Db_项目abc
  • def.test.com------->使用db_ProjectDEF
我使用url重写来解析子域名,并使用子域名来选择存储在主数据库中的数据库连接字符串


谢谢

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

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

    项目符号和代码不能很好地相互配合,需要在两者之间添加一些文本才能真正格式化:-)