ADO .NET - Camada de Acesso a dados Genérica 3 (revisitado)


Na segunda parte deste artigo preparamos o projeto Windows Forms para testar a nossa camada de acesso a dados, incluindo a referência ao nosso projeto DALGeneric e definindo as strings de conexão e o nome do provedor no arquivo de configuração App.Config e realizamos o teste com o banco de dados SQL Server.

Vamos agora fazer o teste usando o banco de dados MySQL.

1- Testando para o MySql

Para testar o MySQL vou utilizar a versão 5.1 que tenho instalada em minha máquina. Para isso criei o banco de dados cadastro e a tabela contatos com a estrutura exibida na figura abaixo que foi obtida a partir do MySQL Administrator:

Eu criei também no banco de dados 5 stored procedures que são mostradas abaixo com o respectivo código:

  1. atualizaContato
CREATE DEFINER=`root`@`localhost` PROCEDURE `atualizaContato`(_id INT , _nome VARCHAR(45), _email VARCHAR(45), _sexo VARCHAR(45))
BEGIN
update contatos set nome=_nome, email = _email, seox = _sexo Where id = _id;
END
  1. deletaContato
CREATE DEFINER=`root`@`localhost` PROCEDURE `deletaContato`(_id INT)
BEGIN
delete from contatos where id = _id;
END
  1. listaContatoPorId
CREATE DEFINER=`root`@`localhost` PROCEDURE `listaContatoPorId`(IN _id INT)
BEGIN
if ( _id IS NULL) THEN
Select * from contatos;
else
select * from contatos where id=_id ;
end if;
END
  1. listaContatos
CREATE DEFINER=`root`@`localhost` PROCEDURE `listaContatos`()
BEGIN
Select * from contatos;
END
  1. salvaContato
CREATE DEFINER=`root`@`localhost` PROCEDURE `salvaContato`( _nome VARCHAR(45), _email VARCHAR(45), _sexo VARCHAR(45))
BEGIN
insert into contatos (nome,email,sexo) values (_nome, _email, _sexo);
END

    Abaixo vemos as stored procedures listadas no banco de dados usando o MysQL Administrator.

Nosso objetivo será acessar a tabela contatos realizando as operações básicas e usando as stored procedures.

Vamos ver se nossa camada de acesso a dados genérica é mesmo genérica e vai dar conta do recado.

Antes de iniciar os testes temos que definir mais um item em nossa solução.

Temos que incluir uma referência ao Connector/Net que é um driver ADO .NET para o MySQL em nosso projeto da camada de acesso a dados.

Clique com o botão direito sobre o projeto DALGeneric e selecione Add Reference;

Na janela Add Reference clique em Browse e localize o local onde você descompactou os arquivos do Connector/Net e selecione o arquivo MySQL.Data.dll, marque a opção e clique em Ok;

Agora o último ajuste...

Para que o a conexão com o MySQL seja aberta temos que alterar a classe ConexaoDB do projeto DALGeneric informando o nome da string de conexão como MySQLConnectionString :

  Shared Sub New()
        Try
            _connectionString = ConfigurationManager.ConnectionStrings("MySQLConnectionString").ConnectionString
            _providerName = ConfigurationManager.ConnectionStrings("MySQLConnectionString").ProviderName
        Catch ex As Exception
            Throw New Exception("Erro ao acessar a string de conexão")
        End Try

    End Sub

Pronto agora sim podemos iniciar os testes !!!

Vamos incluir um novo formulário no projeto DALWinTeste. Selecione o projeto e a partir do menu PROJECT clique em Add Windows Forms;

A seguir aceite o nome padrão form2.vb e clique em Add.

Vamos definir neste arquivo form2.vb a nossa interface. Inclua a partir da ToolBox os controles baixo neste formulário:

Defina o seguinte leiaute no formulário:

Clique com o botão direito sobre o projeto e selecione Properties e defina no projeto o startup form como sendo o form2.vb.

1- Carregando dados no DataGridView usando a stored procedure 'listaContatos'

Quando o formulário for carregado vamos exibir os dados da tabela contatos no controle DataGridView.

Para isso no evento Load do formulário form2.vb defina o código abaixo:

 Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        carregaContatos()
 End Sub

Agora crie a rotina carregaContatos() com o código a seguir:

Private Sub carregaContatos()
        Try
            Dim ds = New DataSet
            Dim cmd = "listaContatos"
            ds = DALGeneric.AcessoGenericoDB.ExecutarComando(cmd, CommandType.StoredProcedure, Nothing, DALGeneric.AcessoGenericoDB.TipoDeComando.ExecuteDataSet)
            dgvContatos.DataSource = ds.Tables(0)
        Catch ex As Exception
            MessageBox.Show("Erro : " & ex.Message, "Erro ao acessar o banco de dados", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Criamos uma instância do objeto DataSet e definimos a instrução SQL como sendo a store procedure 'listaContatos';

A seguir usamos o método ExecutarComando da nossa camada de acesso a dados DALGeneric e atribuímos o resultado ao DataGridview:

Veja o resultado obtido:

2- Incluindo um novo contato na tabela contatos usando a stored procedure 'salvaContato'

Para incluir um novo contato vamos informar o valores nas caixas de texto (com exceção do código que será atribuído automaticamente pelo SGBD).

No evento Click do botão de comando Incluir defina o código abaixo:

  Private Sub btnIncluir_Click(sender As Object, e As EventArgs) Handles btnIncluir.Click
        Dim nome As String = txtNome.Text
        Dim email As String = txtEmail.Text
        Dim sexo As String = txtSexo.Text
        Dim listaParametros As New List(Of DbParameter)

        listaParametros.Add(DALGeneric.GenericDB.CriarParametro("_nome", DbType.String, nome))
        listaParametros.Add(DALGeneric.GenericDB.CriarParametro("_email", DbType.String, email))
        listaParametros.Add(DALGeneric.GenericDB.CriarParametro("_sexo", DbType.String, sexo))
        Try
            Dim cmd = "salvaContato"
            DALGeneric.AcessoGenericoDB.ExecutarComando(cmd, CommandType.StoredProcedure, listaParametros, DALGeneric.AcessoGenericoDB.TipoDeComando.ExecuteNonQuery)
        Catch ex As Exception
            MessageBox.Show("Erro : " & ex.Message, "Erro ao acessar o banco de dados", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Neste código estamos obtendo os valores das caixas de texto e atribuindo a variáveis locais: nome, email e sexo.

A seguir estou definindo um lista de parâmetros do tipo DbParameter e por causa disso (e também por não ter criado uma camada de negócios) eu vou ser obrigado a incluir o namespace System.Data.Common no início do formulário usando a declaração : Imports System.Data.Common

Estou criando os parâmetros usando o método CriarParametro() onde o nome do parâmetro deve estar de acordo com o que foi definido na stored procedure (_nome,_email e _sexo)

Nota: Podemos também usar a sintaxe  listaParametros.Add(DALGeneric.GenericDB.CriarParametro("?_nome", DbType.String, nome)) , onde usamos o ponto de interrogação na frente do nome do parâmetro.

Depois estou definindo a stored procedure 'salvaContato' que será usada para incluir as informações na tabela contatos.

Finalmente estou chamando o método ExecutarComando da classe DALGeneric passando os parâmetros.

Executando o projeto e fornecendo os valores nas caixas de texto, após clicar no botão Incluir teremos o resultado abaixo:

3- Excluindo um contato da tabela contatos usando a stored procedure 'deletaContato'

Para excluir um contato vamos informar o código do contato na caixa de texto e passá-lo como parâmetro.

No evento Click do botão de comando Excluir defina o código abaixo:

Private Sub btnExcluir_Click(sender As Object, e As EventArgs) Handles btnExcluir.Click
        Dim codigo As Integer = Convert.ToInt32(txtCodigo.Text)
        Dim listaParametros As New List(Of DbParameter)
        listaParametros.Add(DALGeneric.GenericDB.CriarParametro("_id", DbType.Int32, codigo))
        Try
            Dim cmd = "deletaContato"
            DALGeneric.AcessoGenericoDB.ExecutarComando(cmd, CommandType.StoredProcedure, listaParametros, DALGeneric.AcessoGenericoDB.TipoDeComando.ExecuteNonQuery)
        Catch ex As Exception
            MessageBox.Show("Erro : " & ex.Message, "Erro ao acessar o banco de dados", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

A seguir definimos os comandos SQL primeiro usando a stored procedure (cmd) e depois a instrução texto (sql)

A seguir usamos o método ExecutarComando da nossa camada de acesso a dados passando os parâmetros de forma a retornar um dataset (ExecuteDataSet) e um datatable (ExecuteDataTable)

Para o datatable percorremos as linhas e exibimos no listbox e para o dataset atribuímos o resultado ao controle DataGridView.

4- Atualizando um contato usando a stored procedure 'atualizaContato'

Para atualizar um contato vamos informar o código do contato e os novos valores nas caixas de texto e usar a stored procedure atualizaContato.

No evento Click do botão de comando Alterar defina o código abaixo:

 Private Sub btnAlterar_Click(sender As Object, e As EventArgs) Handles btnAlterar.Click
        Dim codigo As Integer = Convert.ToInt32(txtCodigo.Text)
        Dim nome As String = txtNome.Text
        Dim email As String = txtEmail.Text
        Dim sexo As String = txtSexo.Text
        Dim listaParametros As New List(Of DbParameter)
        listaParametros.Add(DALGeneric.GenericDB.CriarParametro("_id", DbType.String, codigo))
        listaParametros.Add(DALGeneric.GenericDB.CriarParametro("_nome", DbType.String, nome))
        listaParametros.Add(DALGeneric.GenericDB.CriarParametro("_email", DbType.String, email))
        listaParametros.Add(DALGeneric.GenericDB.CriarParametro("_sexo", DbType.String, sexo))
        Try
            Dim cmd = "atualizaContato"
            DALGeneric.AcessoGenericoDB.ExecutarComando(cmd, CommandType.StoredProcedure, listaParametros, DALGeneric.AcessoGenericoDB.TipoDeComando.ExecuteNonQuery)
        Catch ex As Exception
            MessageBox.Show("Erro : " & ex.Message, "Erro ao acessar o banco de dados", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

 

O código acima é quase igual ao usado para incluir um novo contato, a diferença é que estamos passando além do nome, email e sexo o  código do contato como parâmetro e usando a stored procedure 'atualizaContato'.

Abaixo um exemplo onde alteremos o email do contato macoratti de código igual a 1:

Assim concluímos o teste da nossa camada genérica de acesso a dados. Lembrando que ela é uma camada incipiente que pode e precisa ser aperfeiçoada mas que já da mostra do que pode fazer.

Saliento novamente a necessidade de criar uma camada de negócios para evitar as referências a classes de acesso a dados que eu tive que fazer na camada de interface. Isso nunca deve ocorrer em uma aplicação de produção.

Pegue o projeto completo aqui : DalGenerica.zip

Mar 1:1 Princípio do evangelho de Jesus Cristo, Filho de Deus.

Mar 1:2 Conforme está escrito no profeta Isaías: Eis que envio ante a tua face o meu mensageiro, que há de preparar o teu caminho;

Mar 1:3 voz do que clama no deserto: Preparai o caminho do Senhor, endireitai as suas veredas;

Mar 1:4 assim apareceu João, o Batista, no deserto, pregando o batismo de arrependimento para remissão dos pecados.

    Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti