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>

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));
        }
        // 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);
        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);
        sqlDatabase.ConfigurationName = databaseSettings.DefaultInstance;
        //devolver instância do objecto Database
        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;
        public MyDatabaseConfigurationView(DatabaseSettings dbSettings)
                  : base(new ConfigurationContext())
            {
                  _dbSettings = dbSettings;
            }
            public override DatabaseSettings GetDatabaseSettings()
            {
                  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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here