.NET - Usando Data Access Application Blocks III


No artigo anterior iniciei o nosso exemplo para usar o  Data Access Application Blocks - DAAB criando a base de dados, a tabela, as stored procedures e preparando o ambiente para referenciar a Enterprise Library.

Vamos continuar criando uma classe onde iremos definir os métodos de acesso aos dados usando a DAAB. Clique com o botão direito do mouse sobre o nome do projeto e selecione a opção Add ->  New Item;

Na janela Add New Item selecione o template Class e informe o nome contatosDAL;

Agora vamos criar 5 métodos relacionados com as stored procedures que já criamos e que irão realizar as seguintes operações:

  1. Incluir dados na tabela Contatos :
  2. Alterar Dados da tabela Contatos;
  3. Excluir Dados da tabela Contatos;
  4. Selecionar todos os dados da tabela Contatos;
  5. Selecionar um contato especifico por nome;

A primeira coisa a fazer é definir os namespaces para as classes que vamos usar. Portanto no início da classe declare os seguintes imports:

Nota: No VB .NET  o comando Imports deve ser colocado no topo do código antes de todo e qualquer comando, exceto a declaração Option;

Imports Microsoft.Practices.EnterpriseLibrary.Data
Imports
System.Data.SqlClient
Imports
System.Data.Common

1- O primeiro método eu vou nomear como selecionaTodosContatos, e irá retornar todos os contatos; desta forma vamos usar a stored procedure sp_SelecionaContatos para retornar todos os contatos, preencher um DataTable e retorná-lo. O código é dado a seguir:

Public Function selecionaTodosContatos() As DataTable
 

'define um objeto DataVase

Dim agenda As Database = DatabaseFactory.CreateDatabase()


'define um objeto DbCommand para executar a stored procedure

'que ir  retornar todos os contatos da tabela Contatos

Dim cmd As DbCommand = agenda.GetStoredProcCommand("sp_SelecionaContatos")


'define um objeto DataTable

Dim contatos As DataTable = New DataTable()


'Executa o comando usando um DataReader e carrega

'o DataTable com o resultado

Using dr As IDataReader = agenda.ExecuteReader(cmd)

     contatos.Load(dr)

End Using
 

'retorna o DataTable

Return contatos


End
Function

Notou como temos um código mais limpo e fácil de ler e manter. Estamos usando os métodos do DAAB definidos na Enterprise Library.

Nota: Estamos usando o comando Using

O objeto que for instanciado via comando “Using“, quando sair do escopo será automaticamente liberado; i.e, será feita uma chamada ao “Dispose” do objeto de forma automática. O comando Using funciona como um  atalho ao comando Try/Catch/Finally, pois quando o compilador gera o assembly em IL, o comando é traduzindo para uma instrução idêntica a instrução nativa do Try/Finally.

2- O segundo método , chamado incluirContatos, irá incluir novos contatos na tabela Contatos e vai usar a stored procedure sp_IncluiContatos. Teremos que passar dois parâmetros : nome e email e obter a data do sistema usando a função . O código completo do método é o seguinte:

Public Sub incluiContatos(ByVal nome As String, ByVal email As String)
 

'define o objeto DataBase

Dim iContatos As Database = DatabaseFactory.CreateDatabase()


'define um objeto DbCommand para executar a stored procedure

'que ir  incluir novos contatos da tabela Contatos

Dim cmd As DbCommand = iContatos.GetStoredProcCommand("sp_IncluiContatos")


'define os parƒmetros usados na stored procedure

iContatos.AddInParameter(cmd, "@nome", DbType.String, nome)

iContatos.AddInParameter(cmd, "@email", DbType.String, email)


'executa comando

iContatos.ExecuteNonQuery(cmd)

 

End Sub

Veja que com apenas  6 linhas de código criamos a rotina de inclusão.

3- O terceiro , chamado excluiContatos, irá excluir contatos já cadastrados na tabela Contatos e vai usar a stored procedure sp_ExcluiContato. Não há parâmetros nesta rotina. O código completo do método é o seguinte:

Public Sub excluiContatos(ByVal codigo As Integer)
 

'define o objeto DataBase

Dim exc_Contatos As Database = DatabaseFactory.CreateDatabase()


'define um objeto DbCommand para executar a stored procedure

'que ir  incluir novos contatos da tabela Contatos

Dim cmd As DbCommand = exc_Contatos.GetStoredProcCommand("sp_ExcluiContato")


'define os parƒmetros usados na stored procedure

exc_Contatos.AddInParameter(cmd, "@codigo", DbType.Int32, codigo)


'executa comando

exc_Contatos.ExecuteNonQuery(cmd)


End
Sub

4- O quarto método , chamado selecionaContatoPorCodigo, irá selecionar um contato pelo código informado como parâmetro. Aqui estamos usando a stored procedure sp_SelecionaContatoPorCodigo e passando o parâmetro codigo. Será retornado um dataset com os dados obtidos. Veja o código a seguir:

Public Function selecionaContatoPorCodigo(ByVal codigo As Integer) As DataSet
 

'define o objeto DataBase

Dim seleCod_Contatos As Database = DatabaseFactory.CreateDatabase()


'define um objeto DbCommand para executar a stored procedure

'que ir  incluir novos contatos da tabela Contatos

Dim cmd As DbCommand = seleCod_Contatos.GetStoredProcCommand("sp_SelecionaContatoPorCodigo")


'define o dataset

Dim ds As New DataSet


'carrega o dataset

seleCod_Contatos.LoadDataSet(cmd, ds, "Contatos")


'retorna o dataset

Return ds

End Function

5- O último método , chamado atualizaContatos, irá atualizar os contatos da tabela Contatos. Aqui estamos usando 3 parâmetros : codigo, nome e email e a stored procedure sp_AlteraContatos. Veja o código abaixo:

Public Sub atualizaContatos(ByVal codigo As Integer, ByVal nome As String, ByVal email As String)
 

'define o objeto DataBase

Dim alt_Contatos As Database = DatabaseFactory.CreateDatabase()


'define um objeto DbCommand para executar a stored procedure

'que ir  incluir novos contatos da tabela Contatos

Dim cmd As DbCommand = alt_Contatos.GetStoredProcCommand("sp_AlteraContatos")


'define os parƒmetros usados na stored procedure

alt_Contatos.AddInParameter(cmd, "@codigo", DbType.Int32, codigo)

alt_Contatos.AddInParameter(cmd, "@nome", DbType.String, nome)

alt_Contatos.AddInParameter(cmd, "@email", DbType.String, email)


'executa comando

alt_Contatos.ExecuteNonQuery(cmd)


End
Sub

Com isso terminamos de definir os métodos que iremos usar em nossa aplicação em todos eles usamos os métodos das classes presentes no DAAB.

A classe abstrata DataBase fornece diversos métodos que podemos usar conforme o nosso interesse. A seguir relaciono alguns deles:

O método CreateDataBase da classe DataBaseFactory irá retornar uma instância de um banco de dados a partir das configurações que forem definidas no arquivo de configuração. No nosso exemplo o arquivo App.Config.

Podemos então ter vários banco de dados definidos no arquivo de configuração. Veja abaixo um arquivo de configuração com mais dois bancos de dados definidos: 1 banco de dados Access(Teste) e outro SQL Server Compact(Vendas) , além do nosso banco de dados Agenda.mdf:

<?xml version="1.0" encoding="utf-8"?>

<configuration>

<configSections>

<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

</configSections>

<connectionStrings>
 

<add name="Agenda" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Agenda.mdf;Integrated Security=True;User Instance=True"

providerName="System.Data.SqlClient" />


<
add name="Vendas" connectionString="Data Source=|DataDirectory|\Vendas.sdf" providerName="Microsoft.SqlServerCe.Client.3.5" />


<
add name="Teste" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\db1.mdb" providerName="System.Data.OleDb" />


</
connectionStrings>
 

<dataConfiguration defaultDatabase="Agenda"/>

</configuration>

 

Eles são diferenciados pelo nome dado a string de conexão através da propriedade name. Podemos definir então qual banco de dados iremos usar definindo o <dataConfiguration defaultDataBase>.

O método CreateDataBase aceita um argumento que representa uma entrada de uma instância de um DataBase no arquivo de configuração. Alterando esta instância podemos alterar o tipo de objeto de banco de dados que o método irá retornar. Percebeu que não precisamos declarar objetos SQLDataBase , pois estou usando a classe base , DataBase, abstraindo assim o meu código do provedor. Tudo isso é feito usando o padrão Factory.

Como a classe DataBaseFactory é NotInheritable (Sealed) ela não pode ser herdada, e o seu construtor é privado de modo que ela não pode também ser instanciada diretamente. Com isso podemos chamar o método estático CreateDataBase sem ter que criar uma instância da sua classe.

Como estamos usando stored procedures estou usando o método GetStoredProcCommand para executar cada uma das stored procedures definidas. Se eu quiser comandos SQL temos o método GetSqlStringCommand.

Vamos agora criar um formulário para centralizar estas operações.

Clique com o botão direito do mouse sobre o nome do projeto e selecione a opção Add -> New  Item; e a seguir selecione Windows Forms e informe o nome frmContatos.vb.

Defina neste formulário o leiaute conforme a figura abaixo. Nela temos os seguintes componentes:

DataGridView - dgvContatos

4 controles Buttons:

- btnIncluir
- btnAlterar
- btnExcluir
- btnConsultar
- btnSair

No próximo artigo irei mostrar como implementar o código de cada um dos botões para realizar as operações básicas de manutenção de dados usando os métodos da nossa classe contatosDAL.

Veja continuação no artiigo... Usando Data Access Application Blocks IV

Eu sei , é apenas VB .NET , mas eu gosto..

referências:


José Carlos Macoratti