2008-11-28 25 views
8

¿Hay alguna manera de cambiar la cadena de conexión de un objeto DataBase en Enterprise Library en tiempo de ejecución? He encontrado this enlace, pero es un poco anticuado (2005)Cambiar cadena de conexión en tiempo de ejecución en Enterprise Library

también he encontrado this pero parece aplicarse a .Net, en general, me preguntaba si había algo que se podía hacer específicamente para EntLib .

Estaba pasando el nombre de la cadena de conexión al método CreateDatabase() en el objeto DatabaseFactory y funcionó hasta ayer que mi gestor de proyecto me pidió que admitiera más de una instancia de base de datos. Sucede que tenemos que tener una base de datos por estado (una para CA, otra para FL, etc.) por lo que mi software necesita pasar por todas las bases de datos y hacer algo con los datos, pero usará el mismo archivo de configuración.

Gracias de antemano.

Respuesta

3

Si se echa un vistazo a "Enterprise Library Docs - Adding Application Code" dice esto:

"Si conoce la cadena de conexión para la base de datos que desea crear, que puede pasar por alto la información de configuración de la aplicación y utilice un constructor para crear directamente el objeto de base de datos . Como la clase Base de datos es una clase base abstracta, debe construir uno de sus tipos derivados .determina el proveedor de datos ADO.NET. Por ejemplo, la clase SqlDatabase utiliza el proveedor SqlClientFactory, la clase SqlCeDatabase utiliza el proveedor SqlCeProviderFactory, y la clase OracleDatabase utiliza la proveedor OracleClientFactory. Es su responsabilidad de construir el tipo apropiado de la clase de base de datos para la cadena de conexión."

A continuación, pasa por poner algunos ejemplos. Esto podría sugerir que no se debe utilizar la DatabaseFactory y usted debe será la creación de una nueva clase de base de datos para cada uno de sus diferentes conexiones

2

Aquí es de Zona de Red de Yang:.

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

vistazo a esto: Open Microsoft.practices.EnterpriseLibrary database with just a connection string

sólo tiene que utilizar el código de seguimiento, se puede programar a crear la base de datos en tiempo de ejecución

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

Se resolvió mi problema. Tengo una sola aplicación web que usa muchas bases de datos, de acuerdo con el subdominio diferente en la url para conectarme a la base de datos diferente. tales como:

  • abc.test.com ------> utilizar el Db_projectABC
  • def.test.com ------> utilizar el db_ProjectDEF

utilizo url-reescritura para analizar el nombre de subdominio, y utilizar el nombre del subdominio que elegir que es cadena de conexión de base de datos que almacena en la base de datos principal.

Gracias

+0

Excelente solucionado mi gran problema gracias a @bentz –

1

Podemos utilizar el siguiente fragmento de código para conectarse a múltiples bases de datos.

DLL agregar como referencia

  1. Microsoft.Practices.EnterpriseLibrary.Common.dll
  2. Microsoft.Practices.EnterpriseLibrary.Data.dll
  3. Microsoft.Practices.ServiceLocation.dll

El fragmento:

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");  
+1

las viñetas y el código no funcionan bien entre ellos, necesita algo de texto entre ellos para realmente formatear :-) – kleopatra

Cuestiones relacionadas