Изменение строки подключения во время выполнения в Enterprise Library - PullRequest
8 голосов
/ 28 ноября 2008

Есть ли способ изменить строку подключения объекта DataBase в Enterprise Library во время выполнения? Я нашел эту ссылку, но она немного устарела (2005)

Я также нашел это , но, похоже, это относится к .Net в целом, мне было интересно, можно ли что-то сделать специально для EntLib.

Я просто передавал имя строки подключения методу CreateDatabase () в объекте DatabaseFactory, и это работало до вчерашнего дня, когда мой менеджер проекта попросил меня поддержать более одного экземпляра базы данных. Бывает, что у нас должна быть одна база данных на состояние (одна для CA, одна для FL и т. Д.), Поэтому моему программному обеспечению необходимо циклически проходить по всем базам данных и что-то делать с данными, но оно будет использовать один и тот же файл конфигурации.

Заранее спасибо.

Ответы [ 4 ]

14 голосов
/ 17 марта 2011

посмотрите на это: Откройте базу данных Microsoft.practices.EnterpriseLibrary с помощью только строки подключения

просто используйте этот следующий код, вы можете программировать создание базы данных во время выполнения

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

Это решило мою проблему. У меня есть одно веб-приложение, использующее много баз данных, в соответствии с другим поддоменом в URL для подключения к другой базе данных. такие как:

  • abc.test.com ------> с использованием Db_projectABC
  • def.test.com ------> с использованием db_ProjectDEF

Я использую url-rewrite для анализа имени субдомена и использую имя субдомена для выбора строки подключения к базе данных, которая хранится в основной базе данных.

Спасибо

3 голосов
/ 19 февраля 2014

Мы можем использовать следующий фрагмент кода для подключения к нескольким базам данных.

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");      
3 голосов
/ 03 декабря 2008

Если вы посмотрите на " Документация по корпоративной библиотеке - добавление кода приложения " это говорит это:

"Если вы знаете строку подключения для базу данных, которую вы хотите создать, вы может обойти приложение Информация о конфигурации и использовать конструктор для непосредственного создания База данных объекта. Потому что база данных класс является абстрактным базовым классом, вы должен построить один из его производных типы. Производный тип базы данных определяет поставщика данных ADO.NET Например, класс SqlDatabase использует провайдер SqlClientFactory, класс SqlCeDatabase использует SqlCeProviderFactory провайдер и Класс OracleDatabase использует Поставщик OracleClientFactory. это ваша обязанность построить соответствующий тип класса базы данных для Строка подключения. "

Затем приводятся некоторые примеры. Это предполагает, что вам не следует использовать DatabaseFactory, и вам следует создавать новый класс Database для каждого из ваших различных соединений.

2 голосов
/ 08 января 2010

Вот из Чистой зоны Яна:

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