Já alguma vez precisaram, usando o Enterprise Library, de estabelecer uma ligação com um número de base de dados variável e em que a base de dados a ligar apenas é conhecida em runtime? Uma solução possível é apresentada de seguida.
Quando se usa o Enterprise Library para efectuar o acesso a dados, é usado um ficheiro de configurações com o nome dataconfiguration.config, onde são guardadas as connectionstrings de acesso à base de dados. Eis um exemplo:
<dataConfiguration>
<xmlSerializerSection …>
<enterpriseLibrary.databaseSettings …>
<databaseTypes>
<databaseType name="Sql Server" … />
</databaseTypes>
<instances>
<instance name="MyConnString" type="Sql Server" connectionString="My Connection String" />
</instances>
<connectionStrings>
<connectionString name="My Connection String">
<parameters>
<parameter name="database" value="myDatabase" isSensitive="false" />
<parameter name="Integrated Security" value="true" isSensitive="false" />
<parameter name="server" value="myServer" isSensitive="false" />
</parameters>
</connectionString>
</connectionStrings>
</enterpriseLibrary.databaseSettings>
</xmlSerializerSection>
</dataConfiguration>
<xmlSerializerSection …>
<enterpriseLibrary.databaseSettings …>
<databaseTypes>
<databaseType name="Sql Server" … />
</databaseTypes>
<instances>
<instance name="MyConnString" type="Sql Server" connectionString="My Connection String" />
</instances>
<connectionStrings>
<connectionString name="My Connection String">
<parameters>
<parameter name="database" value="myDatabase" isSensitive="false" />
<parameter name="Integrated Security" value="true" isSensitive="false" />
<parameter name="server" value="myServer" isSensitive="false" />
</parameters>
</connectionString>
</connectionStrings>
</enterpriseLibrary.databaseSettings>
</xmlSerializerSection>
</dataConfiguration>
Para obter uma ligação à base de dados, é usado o seguinte código:
Database databaseConnection = DatabaseFactory.CreateDatabase("MyConnString”);
Esta solução obriga a que todas as connectionstrings sejam guardadas no ficheiro dataconfiguration.config.
Se tivermos, por exemplo, uma aplicação que efectua o aprovisionamento de novas base de dados ou apaga bases de dados já existentes, e não pretendermos alterar o ficheiro dataconfiguration.config programaticamente, existe uma solução mais flexível, apresentada de seguida, que retira a dependência deste ficheiro para guardar as connectionstrings.
O seguinte bloco de código usa a API do Data Application Block do Enterprise Library para criar a ligação à base de dados:
private static Database CreateDynamicDataBase(string databaseName)
{
// criar uma ligação a uma base de dados (databaseName)
ConnectionStringData connectionStringData =
new ConnectionStringData();
connectionStringData.Name = databaseName;
// adicionar parâmetros da connectionstring (ligação usando
// Windows Integrated Authentication ou SQL Authentication)
connectionStringData.Parameters.Add(
new ParameterData("Server", Settings.DatabaseServer));
connectionStringData.Parameters.Add(
new ParameterData("Database", databaseName));
if (Settings.DatabaseIntegratedAuthentication)
connectionStringData.Parameters.Add(
new ParameterData("Integrated Security", "true"));
else
{
connectionStringData.Parameters.Add(
new ParameterData("user id", Settings.DatabaseUserId));
connectionStringData.Parameters.Add(
new ParameterData("password", Settings.DatabasePassword));
}
connectionStringData.Parameters.Add(
new ParameterData("Integrated Security", "true"));
else
{
connectionStringData.Parameters.Add(
new ParameterData("user id", Settings.DatabaseUserId));
connectionStringData.Parameters.Add(
new ParameterData("password", Settings.DatabasePassword));
}
// definir o tipo de base de dados a que nos estamos a ligar
DatabaseTypeData sqlDatabaseTypeData =
new DatabaseTypeData("Sql Server", typeof(SqlDatabase).FullName);
// criar instância com a connectionstring criada anteriormente e adicionar às configurações
InstanceData instance = new InstanceData(connectionStringData.Name, sqlDatabaseTypeData.Name, connectionStringData.Name);
DatabaseTypeData sqlDatabaseTypeData =
new DatabaseTypeData("Sql Server", typeof(SqlDatabase).FullName);
// criar instância com a connectionstring criada anteriormente e adicionar às configurações
InstanceData instance = new InstanceData(connectionStringData.Name, sqlDatabaseTypeData.Name, connectionStringData.Name);
DatabaseSettings databaseSettings = new DatabaseSettings();
databaseSettings.ConnectionStrings.Add(connectionStringData);
databaseSettings.DatabaseTypes.Add(sqlDatabaseTypeData);
databaseSettings.Instances.Add(instance);
databaseSettings.DefaultInstance = instance.Name;
DatabaseConfigurationView configView =
new MyDatabaseConfigurationView(databaseSettings);
// criar e inicializar instância do objecto Database
SqlDatabase sqlDatabase = new SqlDatabase();
sqlDatabase.Initialize(configView);
databaseSettings.ConnectionStrings.Add(connectionStringData);
databaseSettings.DatabaseTypes.Add(sqlDatabaseTypeData);
databaseSettings.Instances.Add(instance);
databaseSettings.DefaultInstance = instance.Name;
DatabaseConfigurationView configView =
new MyDatabaseConfigurationView(databaseSettings);
// criar e inicializar instância do objecto Database
SqlDatabase sqlDatabase = new SqlDatabase();
sqlDatabase.Initialize(configView);
sqlDatabase.ConfigurationName = databaseSettings.DefaultInstance;
//devolver instância do objecto Database
return sqlDatabase;
}
return sqlDatabase;
}
// Classe auxiliar interna que devolve uma instância de um objecto
// DatabaseConfigurationView a partir de uma instância de um objecto // DatabaseSettings
internal class MyDatabaseConfigurationView : DatabaseConfigurationView
{
private DatabaseSettings _dbSettings;
// DatabaseConfigurationView a partir de uma instância de um objecto // DatabaseSettings
internal class MyDatabaseConfigurationView : DatabaseConfigurationView
{
private DatabaseSettings _dbSettings;
public MyDatabaseConfigurationView(DatabaseSettings dbSettings)
: base(new ConfigurationContext())
{
_dbSettings = dbSettings;
}
: base(new ConfigurationContext())
{
_dbSettings = dbSettings;
}
public override DatabaseSettings GetDatabaseSettings()
{
return _dbSettings;
}
}
{
return _dbSettings;
}
}
Como se pode verificar facilmente, pelo bloco de código acima apresentado, este mapeia na estrutura do ficheiro dataconfiguration.config apresentada anteriormente.
Para quem não conhece o Enterprise Library, é uma bilbioteca de "Application Blocks" desenvolvida pela Microsoft, com o objectivo de permitir aos programadores agilizar o processo de desenvolvimento de tarefas comuns tais como o acesso a dados, cache, gestão de excepções, etc. Para fazer o download e saber mais detalhes, cliquem aqui.