Data Access Application Block com VB.NET

Aumente sua produtividade com Enterprise Library 2.0

Tecnologias:

Visual C#.NET

Visual Basic.NET

Windows Applications

Web Applications

 

Links:

http://msdn.microsoft.com/practices/

http://msdn.microsoft.com/library/?url=/library/en-us/dnpag2/html/EntLib2.asp

http://www.microsoft.com/downloads/details.aspx?FamilyId=C8CA14D0-05EA-4A44-AE78-F5E4DF6208AF&displaylang=en

 

Introdução

A coleção Enterprise Library for .NET Framework 2.0 – Janeiro 2006 é a mais nova versão do Microsoft Patterns & Practices Enterprise Library. A Enterprise Library é uma coleção de componentes de software reutilizáveis, criados para auxiliar os desenvolvedores nas tarefas mais comuns para o desenvolvimento de software corporativo. Esta versão foi criada visando aproveitar os novos recursos disponíveis no Microsoft.NET Framework 2.0.

Benefícios

Os blocos de aplicação que constituem a coleção Enterprise Library 2.0 foram construídos seguindo os modelos e melhores práticas recomendadas pela Microsoft. Eles podem ser consumidos facilmente pelas aplicações .NET, garantindo produtividade, confiabilidade e segurança ao seu projeto.

Objetivos

Consistência. Todos os blocos da coleção Enterprise Library 2.0 foram construídos utilizando rigorosos padrões de implementação.

Extensibilidade. Todos os blocos incluem pontos de extensibilidade que permitem aos desenvolvedores customizarem o comportamento do bloco adicionando seu próprio código.

Facilidade de Uso. A coleção Enterprise Library 2.0 varias melhorias na usabilidade, incluindo uma ferramenta de configuração com interface gráfica, uma instalação simples e uma documentação clara e completa, com diversos exemplos de utilização.

Integração. Todos os blocos foram construídos e testados para serem utilizados em conjunto ou individualmente.

O DAAB - Data Access Application Block

Este artigo aborda o uso do DAAB - Data Access Application Block. Este bloco oferece acesso aos recursos mais utilizados do ADO.NET 2.0, expondo esses recursos através de uma classe de fácil utilização. Serão ilustrados os seguintes métodos: CreateDatabase, ExecuteScalar, ExecuteDataset, LoadDataset, ExecuteReader e ainda os recursos de encriptação do arquivo Web.config. Para completar os exemplos apresentados neste artigo é necessário que o leitor tenha instalado em seu computador a coleção Enterprise Library 2.0. O download pode ser realizado no enderço   http://msdn.microsoft.com/library/?url=/library/en-us/dnpag2/html/EntLib2.asp.  Os exemplos foram construídos com o Visual Studio 2005, SQL Server e o banco de dados Northwind.

O método CreateDatabase

Abaixo você pode examinar um exemplo de utilização do método CreateDatabase do objeto DatabaseFactory. Com apenas uma linha de código o desenvolvedor pode estabelecer a conexão entre sua aplicação e o banco de dados. O Quadro 1 apresenta um exemplo de utilização deste método.

Imports System.Data

Imports Microsoft.Practices.EnterpriseLibrary.Data

 

Protected Sub cmdCreateDatabase_Click(ByVal sender As Object,

  ByVal e As System.EventArgs) Handles cmdCreateDatabase.Click

 

Dim db As Database = DatabaseFactory.CreateDatabase("Northwind")

Dim count As Integer = CType(db.ExecuteScalar(CommandType.Text,

  "select count(*) from orders"), Integer)

Dim message As String = String.Format(

  "Foram encontrados {0} registros na tabela ORDERS.", count.ToString())

lblResults.Text = message.ToString()

 

End Sub

Quadro 1. O método CreateDatabase

As linhas de código acima obtém uma instância do objeto Database através a string de conexão definida no arquivo Web.config. Neste ponto, a conexão com o banco de dados não foi realmente criada. O método CreateDatabase apenas lê as informações a string de conexão e aguarda a chamada de um dos comandos ExecuteScalar, ExecuteDataset, LoadDataset ou ExecuteReader que serão responsáveis por abrir e fechar a conexão com o banco de dados.

Método Execute Scalar

O método ExecuteScalar deve ser utilizado para obter um único valor de retorno do banco de dados. Uma alternativa para este método é utilizar os parâmetros OUTPUT combinados com o método ExecuteNonQuery para obter o mesmo tipo de resultado.

Na coleção Enterprise Library 2.0, o método ExecuteScalar pode ser disparado de formas diferentes. Uma delas foi ilustrada no exemplo do método CreateDatabase. Naquele exemplo, o método ExecuteScalar recebeu uma instrução SQL diretamente, mas quando trabalhamos com Stored Procedures, a construção do procedimento é diferente. Veja o código apresentado no Quadro 2:

 

Imports System.Data

Imports Microsoft.Practices.EnterpriseLibrary.Data

 

Protected Sub cmdExecuteScalar_Click(ByVal sender As Object,

  ByVal e As System.EventArgs) Handles cmdExecuteScalar.Click

 

Dim db As Database = DatabaseFactory.CreateDatabase("Northwind")

Dim sqlCommand As String = "GetProductName"

Dim dbCommand As DbCommand = db.GetStoredProcCommand(sqlCommand,

txtProductID.Text.ToString())

Dim productName As String = db.ExecuteScalar(dbCommand)

lblResults.Text = "Este é o código do produto: " & productName.ToString()

 

End Sub

Quadro 2: O método ExecuteScalar com Stored Procedure

  O método GetStoredProcCommand obtém a Stored Procedure armazenada no banco de dados e passa um parâmetro do tipo Array contendo a coleção de parâmetros para o procedimento armazenado. Teste o funcionamento no botão abaixo.

Execute Dataset

O método ExecuteDataset é responsável por abrir e fechar a conexão, assim como retornar um novo objeto Dataset carregado com os resultados do comando SQL, que pode incluir múltiplas tabelas.

Observe que no código do Quadro 3, não foi passado o nome da instância do banco de dados para o método CreateDatabase. Neste caso, a conexão padrão, definida no arquivo de Web.config será utilizada.

 

Imports System.Data

Imports Microsoft.Practices.EnterpriseLibrary.Data

 

Protected Sub cmdExecuteDataset_Click(ByVal sender As Object,

  ByVal e As System.EventArgs) Handles cmdExecuteDataset.Click

 

Dim db As Database = DatabaseFactory.CreateDatabase()

Dim ds As DataSet = db.ExecuteDataSet(CommandType.Text,

  "select * from customers")

 

grdCustomers.DataSource = ds

grdCustomers.DataBind()

 

End Sub

Quadro 3: Método ExecuteDataSet

Load Dataset

Existem dois métodos na classe Database que podem ser utilizados para carregar um Dataset, são os métodos ExecuteDataSet que retorna um novo objeto Dataset carregadp e o LoadDataSet que adiciona um novo DataTable à um DataSet existente. A sobrecarga utilizada neste exemplo requer um argumento que indica o CommandType, o segundo argumento que indica o comando SQL, o terceiro argumento que indica o nome do objeto DataSet e por último um argumento do tipo Array que será carregado com os dados extraídos do banco.

 

Imports System.Data

Imports Microsoft.Practices.EnterpriseLibrary.Data

 

Protected Sub cmdLoadDataset_Click(ByVal sender As Object,

  ByVal e As System.EventArgs) Handles cmdLoadDataset.Click

 

Dim db As Database = DatabaseFactory.CreateDatabase()

Dim ds As DataSet = db.ExecuteDataSet(CommandType.Text,

  "select * from customers")

db.LoadDataSet(CommandType.Text, "select * from products",

  ds, New String() {"Products"})

grdProducts.DataSource = ds.Tables("Products")

grdProducts.DataBind()

 

End Sub

Quadro 4: O método LoadDataSet

Execute Reader

Uma das sobrecargas do método ExecuteReader requer um parâmetro do tipo String indicando o nome da Stored Procedure, e também um conjunto de parâmetros opcionais. Esta sobrecarga, localizará a Stored Procedure indicada no parâmetro, fará a leitura dos meta-dados e armazenará em cache para usá-lo posteriormente, também definirá um conjunto de parâmetros quando indicados na chamada do método. Neste exemplo, utilizei outra construção para o procedimento. Observe que não há nenhuma instrução para fechar a conexão com o banco de dados, mas é importante destruir o objeto DataReader resultante. Isto foi feito com o a declaração using no início do procedimento, desta forma, o método DataReader.Dispose será disparado ao final do procedimento, fazendo com que a conexão vinculada ao objeto também seja fechada.

 

Protected Sub cmdExecuteDataReader_Click(ByVal sender As Object,

  ByVal e As System.EventArgs) Handles cmdExecuteDataReader.Click

 

Dim db As Database = DatabaseFactory.CreateDatabase() 

cboCategories.Items.Clear()

Using dataReader As IDataReader = db.ExecuteReader("GetCategories")

       While (dataReader.Read())

           Dim item As ListItem = New ListItem()

           item.Value = dataReader("CategoryID")

           item.Text = dataReader("CategoryName")

           cboCategories.Items.Add(item)

       End While

End Using

 

End Sub

Quadro 5: O método ExecuteDataReader

Protegendo as ConnectionStrings no Web.config

Quando trabalhamos com bancos de dados, uma das preocupações do desenvolvedor está relacionada ao armazenamento das strings de conexão no arquivo Web.config. Normalmente estas informações incluem usuário e senha para acesso ao banco de dados, e a hipótese de que alguém tenha acesso a informações como esta não é confortável. Agora, com o .NET Framework 2.0, tanto em aplicações Windows como nas aplicações Web, temos uma alternativa para esta situação, podemos utilizar os métodos ProtectedSection e UnprotectSection para criptografar nossas strings de conexão. Este procedimento é simples e requer poucas linhas de código para sua implementação. A Figura 1 mostra a interface simples utilizada para ilustrar este exemplo.

 

 

Figura 1. Protegendo as informações do Web.config

Para construir o exemplo acima, utilizei a janela Server Explorer, arrastando a tabela Categories do banco de dados Northwind para meu WebForm1. Esta ação, faz com que o Visual Studio adicione automaticamente um controle do tipo GridView e um SqlDataSource.

Além disso, a seção connectionStrings é adicionada no arquivo Web.config. Também foram acrescentados dois botões de comando, um deles para criptografar as strings de conexão e outro para restaurar o padrão original de texto plano. O Quadro 6 mostra o código necessário para este exemplo.

 

Imports System.Web.Configuration

 

Protected Sub cmdEncrypt_Click(ByVal sender As Object,

  ByVal e As System.EventArgs) Handles cmdEncrypt.Click

        EncryptConfig(True)

End Sub

 

Protected Sub EncryptConfig(ByVal bEncrypt As Boolean)

Dim myConfig As Configuration =

  WebConfigurationManager.OpenWebConfiguration("/Encrypt")

 

Dim mySettings As ConfigurationSection =

  myConfig.GetSection("connectionStrings")

 

If bEncrypt Then

  mySettings.SectionInformation.ProtectSection(

    "DataProtectionConfigurationProvider")

Else

     mySettings.SectionInformation.UnprotectSection()

End If

myConfig.Save()

End Sub

 

Protected Sub cmdDecrypt_Click(ByVal sender As Object,

  ByVal e As System.EventArgs) Handles cmdDecrypt.Click

        EncryptConfig(False)

End Sub

Quadro 6: Protegendo as strings de conexão

A Figura 2 mostra a seção connectionStrings criptografada após a execução deste procedimento. Observe.

 

 

Figura 2. A seção connectionStrings criptografada

Conclusão

Este artigo mostrou uma visão geral sobre a coleção Enterprise Library 2.0 e algumas utilizações práticas para o bloco de acesso a dados. Também mostrou como utilizar o namespace System.Web.Configuration para proteger as informações de conexão armazenadas no arquivo Web.config.