ADO.NET - Criando um livro de receitas

Este mês escrevi poucos artigos. Também pudera ,  aproveitei e tirei umas férias ( ninguém é de ferro...). Agora que as férias estão no fim irei retomar o pique anterior...

Vou recomeçar falando sobre acesso a dados usando ADO.NET. Este artigo irá mostrar como podemos criar uma solução usando banco de dados e terá o objetivo de mostrar como podemos usar os objetos de acesso a dados do ADO.NET em formulários com combobox e caixas de texto.

Vou mostrar como criar um pequeno livro de receitas eletrônico onde você (sua mãe , sua namorada , sua esposa...) poderá guardar receitas classificadas por categoria. Nesta primeira parte irei mostrar como exibir os dados existentes nas tabelas do projeto - Cadastro de Receitas; mais adiante irei mostrar como podemos incluir , alterar , excluir , dados das receitas e gerenciar as categorias.

A idéia é a seguinte: Vamos supor que você resolveu agradar sua cara metade e também mostrar que é fera em programação Visual Basic e prometeu criar um cadastro de receitas eletrônico usando o VB .NET. Como você já é escolado percebeu que vai precisar usar um banco de dados. O velho e bom Access serve muito bem para esta solução caseira.

Entrou em cena suas habilidades de modelagem de dados e após consultar sua cara metade concluiu que o sistema poderia ser construído usando duas tabelas. Então você criou as tabelas Categorias (para armazenar os dados referente as categorias das receitas) e Receitas que irá guardar as receitas propriamente ditas.(Você resolveu chamar o banco de dados de : receitas.mdb) A estrutura ficou assim :

Como está com pressa você acabou digitando alguns dados nas tabelas para ter uma idéia e a coisa ficou assim :

Rapidamente você pensou no seguinte layout para o formulário inicial :

1-) Duas combobox  : uma carregada com as categorias e a outra deverá exibir as receitas relacionadas com a categoria da primeira combo , ou seja , as combos deverão estar sincronizadas de forma que quando for selecionada uma categoria na primeira combo somente as receitas relacionadas a esta categoria sejam carregadas na segunda combo. (Pensou que era fácil...)

2-) Duas caixas de texto : uma exibindo os ingredientes da receita e outra exibindo as instruções. Aqui também deverá haver o sincronismo com a seleção feita nas combobox de forma que a seleção de uma categoria ou receita mostre os ingredientes e instruções pertinentes. (Agora complicou... )

Pelo menos montar o layout do formulário você sabe. Abaixo o resultado :

Componentes do formulário:

- cboCategorias

- cboReceitas

- txtIngredientes

- txtInstruções

- btnSair

Pronto !!! Só falta fazer a conexão com os dados , escolher os componentes de dados que vai usar (DataReader ou DataSet) , carregar as combos , as caixas de texto e sincronizar tudo...

Então até o momento temos : o banco de dados Access receitas.mdb  , as tabelas Categorias e Receitas e o layout do formulário principal. Nada mal. Falta dar vida a nossa aplicação ... è o que vamos fazer ...

O acesso aos Dados

Você terá que decidir como fará o acesso aos dados . Com toda a sua experiência você já sabe que como a base de dados é Access terá que usar um provedor OLE DB. Mas como será feito o acesso ? Quais as opções ?

Basicamente temos duas opções para o acesso aos dados : DataReader ou DataSet . E como você já leu o artigo - DataReader ou DataSet ? eis a questão !!! -  no site do Macoratti  , já sacou que para o seu projeto a opção de usar DataSet é a mais indicada.

Os próximos passos ,  calculados minuciosamente por você , serão :

  1. criar a conexão com o banco de dados via objeto OleDBConnection

  2. criar um DataAdapter para a tabela Categorias

  3. Gerar o DataSet para a tabela Categorias

  4. criar um DataAdapter para a tabela Receitas filtrando pelo campo categorias

  5. Gerar o DataSet para a tabela Receitas

  6. Configurar o DataSource para as caixas de combinação

  7. Configurar a vinculação das caixas de texto com o Dataset

Ao trabalho :

1 - Inicie um novo projeto no Visual Studio.NET com as seguintes características (sinta-se a vontade para alterar a seu gosto.)

  1. Project Types : Visual Basic Projects
  2. Templates : Windows Application
  3. Name : CadastroReceitas
  4. Location : c:\vbnet\CadastroReceitas

2- Abra a ToolBox e na aba Data clique duas vezes em OleDbConnection. Na caixa Properties clique em ConnectionString e a seguir  em <New Connection> ; Na janela - Propriedades de vinculação de dados - na aba Provedor , selecione o provedor - Microsoft Jet 4.0 OLE DB Provider ; a seguir na aba Conexão insira o nome e caminho do banco de dados receitas.mdb. (veja figura abaixo)

Com isto a conexão esta configurada , vamos agora criar os objetos DataAdapter e DataSet para as tabelas...

3 - Vamos criar então o DataAdapter para a tabela Categorias . Ainda na ToolBox clique em OledbDataAdapter para acionar o assistente de configuração.  Clique em Next> até chegar na janela - Generate SQL statements ; na caixa de texto informe a instrução SQL : Select * from Categorias . Clique me Next> e a seguir em Finish. Pronto ! criamos um objeto DataAdapter para a tabela categorias. Podemos chamá-lo de daCategorias.  

Para gerar o DataSet para esta tabela basta clicar com o botão direito do mouse sobre o objeto daCategorias e selecionar a opção : Generate DataSet... . Na janela Generate DataSet clique em New  e informe o nome do DataSet - dsCategorias - e clique em OK.

4 - Agora vamos criar DataAdapter para a tabela Receitas . Na ToolBox clique em OledbDataAdapter para acionar o assistente de configuração.  Clique em Next> até chegar na janela - Generate SQL statements ; na caixa de texto informe a instrução SQL : SELECT Categoria, Ingredientes, Instrucoes, ReceitaID, ReceitaTitulo FROM Receitas WHERE (Categoria = ?). Clique me Next> e a seguir em Finish. Pronto ! criamos um objeto DataAdapter para a tabela categorias. Podemos chamá-lo de daReceitas.

Nota:  A instrução SQL -  SELECT Categoria, Ingredientes, Instrucoes, ReceitaID, ReceitaTitulo FROM Receitas WHERE (Categoria = ?) usa o campo Categoria como parâmetro para filtrar as receitas para cada categoria.

Para gerar o DataSet para esta tabela basta clicar com o botão direito do mouse sobre o objeto daReceitas e selecionar a opção : Generate DataSet... . Na janela Generate DataSet clique em New  e informe o nome do DataSet - dsReceitas - e clique em OK.

A esta altura do campeonato , o seu projeto deverá ter a seguinte aparência :

 

5- Temos que configurar os controles do formulário para a vinculação dos dados. Vamos começar com as combos. Selecione a combo - cboCategorias - e na janela de propriedades vamos definir as propriedades DataSource e DisplayMember como ao lado:

^

 
6- Selecione agora a combo - cboReceitas e configure suas propriedades: DataSource e DisplayMember como ao lado:

7- Passemos para a configuração das caixas de texto : txtingredientes e txtinstrucoes. Selecione cada caixa de texto e altere sua propriedades DataBindings opção Text , na caixa de propriedades , conforme abaixo

Caixa de texto : txtingredientes Caixa de texto : txtinstrucoes

Com os objetos de acesso aos dados e os controles configurados só resta incluir o código que irá gerenciar a vinculação dos controles com a  fonte de dados . Para isto vamos usar a classe BindingManagerBase. A classe BindingManagerBase gerencia todos os objetos vinculados a mesma fonte de dados. (Ela é uma classe abstrata: a Classe CurrencyManager herda seus métodos.) e possibilita a sincronização dos controles vinculados aos dados em um formulário Windows que estão ligados a mesma fonte de dados. Para isto vamos declarar uma variável do tipo BindingManagerBase logo no início da classe:

Public Class Form1

     Inherits System.Windows.Forms.Form

   Dim receitasBindingManager As BindingManagerBase

Agora podemos incluir o restante do código no projeto. Vamos incluir o código no evento Load do formulário que irá preencher os DataSets : DSCategorias1 e DSReceitas1.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    daCategorias.Fill(DsCategorias1)

    daReceitas.Fill(DsReceitas1)

    receitasBindingManager = Me.BindingContext(DsReceitas1, "Receitas")

End Sub

Cada objeto que herda da classe Control possui um objeto BindingContext . Usamos o BindingContext para criar ou retornar o BindingManagerBase para a fonte de dados usado pelo controles vinculados aos dados.

O código abaixo deve ser incluído no evento SelectedIndexChanged da primeira caixa de combinação - cboCategorias - de forma que quando um usuário selecionar uma categoria , os dados das receitas relacionadas a esta categoria seja exibidas na segunda caixa de combinação.

Private Sub cbocategorias_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbocategorias.SelectedIndexChanged

 

  DsReceitas1.Clear()

  daReceitas.SelectCommand.Parameters("Categoria").Value = cbocategorias.Text

  daReceitas.Fill(DsReceitas1)

  cboreceitas.Focus()

 

End Sub

Finalmente o código do evento SelectedIndexChanged da segunda caixa de combinação - cboReceitas - efetua a sincronização com o item selecionado.

Private Sub cboreceitas_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboreceitas.SelectedIndexChanged

receitasBindingManager.Position = cboreceitas.SelectedIndex

End Sub

O método Position da classe BindingManagerBase obtêm ou define a posição na lista de controles vinculados para onde a fonte de dados aponta.

Pronto !! agora é só rodar o projeto e verificar o seu funcionamento. Abaixo um exemplo exibindo o projeto em execução.

Nesta primeira parte apenas exibimos os dados existentes nas tabelas categorias e receitas em controles vinculados de formulário. Na segunda parte irei mostrar como podemos cadastrar categorias e receitas. Aguarde.

Até breve ...


José Carlos Macoratti