VB .NET - Tratando imagens e eventos dinamicamente (Reserva de Assentos - MySQL) - II


 Neste artigo vou mostrar como podemos tratar imagens e eventos de forma dinâmica simulando uma reserva de assentos bem como acessar o banco de dados MySQL para gravar e recuperar informações.

Vamos continuar nosso protótipo para reserva de assentos persistindo as informações em um banco de dados. (Veja a primeira parte aqui)

Podemos usar diversas abordagens para persistir as informações e em nsso exemplo eu vou usar um abordagem simples e direta e para isso vamos implementar as seguintes funcionalidades:

  • Persistir as informações dos assentos reservados

  • Persistir as informações do cliente que fez a reserva

  • Persistir as informações da data e horário da reserva

  • Identificar o veículo para o qual a reserva foi feita

  • Recuperar todas essas informações para um determinado veículo

Vou utilizar um banco de dados MySQL por ser um banco de dados gratuito e fácil de instalar e usar. Vou criar um Schema chamado Cadastro e definir as seguintes tabelas:

  • Clientes - para armazenar as informações dos clientes;
  • Carro1 - para armazenar as informações das reservas feitas para um veículo específico em uma data e hora;

Abaixo vemos as estruturas de cada tabela e a respectiva instrução SQL usada para sua criação:

use Cadastro;
CREATE TABLE `clientes` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `nome` varchar(80) NOT NULL,
  `cpf` varchar(150) NOT NULL,
  `email` varchar(145) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
CREATE TABLE `Carro1` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `clienteid` int(10) NOT NULL,
  `data` DateTime NOT NULL,
  `hora` DateTime NOT NULL,
  `assento` int(10) NOT NULL,
  `reservado` boolean Default false,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

 

Esse modelo de domínio foi adotado por ser bem simples e facilitar o nosso desenvolvimento. Em um projeto mais complexo com certeza ele terá que ser revisto.

 

Recursos Usados

Criando uma camada de acesso a dados no projeto DAL

Vamos criar uma camada de acesso a dados em nossa aplicação de forma a separar as responsabilidades da camada de interface que é o nosso projeto Windows Forms.

Esse abordagem é muito recomendada para tornar o nosso projeto mais fácil de manter e escalar.

Vamos então incluir um novo projeto em nossa solução na opção File-> Add -> New Project;

A seguir selecione Visual Basic ->Windows Classick Desktop -> Class Library e informe o nome DAL (ou outro a seu gosto);

Após incluir o novo projeto vamos incluir uma referência a biblioteca MySql.Data neste projeto para podermos acessar o MySQL.

No menu Tools clique em Nuget Package Manager -> Manage Nuget Packages for Solution;

Selecione o item MySql.Data, marque o projeto DAL e clique no botão Install;

A seguir crie uma classe chamada AcessoBD nesta classe e defina o seguinte código no projeto

Imports System.Configuration
Imports MySql.Data.MySqlClient

Public Class AcessoBD

    Public Shared Function GetDbConnection() As MySqlConnection
        Try
            Dim conString As String = ConfigurationManager.ConnectionStrings("ConxaoMySQLDesenv").ConnectionString
            Dim connection As New MySqlConnection(conString)
            connection.Open()
            Return connection
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Public Shared Function ExecuteReader(sql As String) As IDataReader
        Dim reader As IDataReader = Nothing
        Using connection As MySqlConnection = GetDbConnection()
            Try
                Using command As New MySqlCommand(sql, connection)
                    reader = command.ExecuteReader()
                    Dim dt = New DataTable()
                    dt.Load(reader)
                    Return dt.CreateDataReader()
                End Using
            Catch ex As Exception
                Throw ex
            End Try
        End Using
    End Function

    Public Function ExecuteNonQuery(sql As String) As Integer
        Dim i As Integer = -1
        Using connection As MySqlConnection = GetDbConnection()
            Try
                Using command As New MySqlCommand(sql, connection)
                    i = command.ExecuteNonQuery()
                End Using
            Catch ex As Exception
                Throw ex
            End Try
            Return i
        End Using
    End Function

    Public Shared Function ExecuteDataSet(sql As String) As DataSet
        Dim ds As DataSet = Nothing
        Using connection As MySqlConnection = GetDbConnection()
            Try
                Using Command As New MySqlCommand(sql, connection)
                    ds = ExecuteDataSet()
                End Using
            Catch ex As Exception
                Throw ex
            End Try
            Return ds
        End Using
    End Function

    Public Shared Function ExecuteDataSet() As DataSet
        Dim da As MySqlDataAdapter = Nothing
        Dim cmd As IDbCommand = New MySqlCommand()
        Dim ds As DataSet = Nothing
        Try
            da = New MySqlDataAdapter()
            da.SelectCommand = DirectCast(cmd, MySqlCommand)
            ds = New DataSet()
            da.Fill(ds)
        Catch ex As Exception
            Throw ex
        End Try
        Return ds
    End Function

    Public Shared Function GetDataTable(sql As String, parameterNames As String(), tipoParametros As MySqlDbType(),
parameterVals As Object()) As DataTable
        Using connection As MySqlConnection = GetDbConnection()
            Try
                Using da As New MySqlDataAdapter(sql, connection)
                    Dim table As New DataTable()
                    FillParameters(da.SelectCommand, parameterNames, tipoParametros, parameterVals)
                    da.Fill(table)
                    Return table
                End Using
            Catch generatedExceptionName As Exception
                Throw
            End Try
        End Using
    End Function

    Public Shared Function GetDataTable(sql As String) As DataTable
        Using connection As MySqlConnection = GetDbConnection()
            Try
                Using da As New MySqlDataAdapter(sql, connection)
                    Dim table As New DataTable()
                    da.Fill(table)
                    Return table
                End Using
            Catch generatedExceptionName As Exception
                Throw
            End Try
        End Using
    End Function

    Public Shared Function SelectScalar(sql As String, parameterNames As String(), parametrosTipos As MySqlDbType(),
parameterVals As Object()) As String
        Using connection As MySqlConnection = GetDbConnection()
            Try
                Using command As New MySqlCommand(sql, connection)
                    FillParameters(command, parameterNames, parametrosTipos, parameterVals)
                    Return Convert.ToString(command.ExecuteScalar())
                End Using
            Catch generatedExceptionName As Exception
                Throw
            End Try
        End Using
    End Function

    Public Shared Function SelectScalar(sql As String) As String
        Using connection As MySqlConnection = GetDbConnection()
            Try
                Using command As New MySqlCommand(sql, connection)
                    Return Convert.ToString(command.ExecuteScalar())
                End Using
            Catch generatedExceptionName As Exception
                Throw
            End Try
        End Using
    End Function

    Public Shared Function ExecuteScalar(sql As String) As Object
        Using connection As MySqlConnection = GetDbConnection()
            Try
                Using command As New MySqlCommand(sql, connection)
                    Return command.ExecuteScalar()
                End Using
            Catch generatedExceptionName As Exception
                Throw
            End Try
        End Using
    End Function

    Public Shared Function CRUD(sql As String, parameterNames As String(), tipo As MySqlDbType(),
parameterVals As Object()) As Integer
        Try
            Using connection As MySqlConnection = GetDbConnection()
                Using command As New MySqlCommand(sql, connection)
                    FillParameters(command, parameterNames, tipo, parameterVals)
                    Return command.ExecuteNonQuery()
                End Using
            End Using
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Private Shared Sub FillParameters(command As MySqlCommand, parameterNames As String(), tipo As MySqlDbType(),
parameterVals As Object())
        Try
            If parameterNames IsNot Nothing Then
                For i As Integer = 0 To parameterNames.Length - 1
                    If tipo(i) = MySqlDbType.Int32 Then
                        command.Parameters.AddWithValue(parameterNames(i), CInt(parameterVals(i)))
                    ElseIf tipo(i) = MySqlDbType.[String] Then
                        command.Parameters.AddWithValue(parameterNames(i), parameterVals(i).ToString())
                    ElseIf tipo(i) = MySqlDbType.Bit Then
                        command.Parameters.AddWithValue(parameterNames(i), Convert.ToBoolean(parameterVals(i)))
                    ElseIf tipo(i) = MySqlDbType.[Date] Then
                        command.Parameters.AddWithValue(parameterNames(i), Convert.ToDateTime(parameterVals(i)))
                    ElseIf tipo(i) = MySqlDbType.DateTime Then
                        command.Parameters.AddWithValue(parameterNames(i), Convert.ToDateTime(parameterVals(i)))
                    ElseIf tipo(i) = MySqlDbType.[Double] Then
                        command.Parameters.AddWithValue(parameterNames(i), Convert.ToDouble(parameterVals(i)))
                    ElseIf tipo(i) = MySqlDbType.[Decimal] Then
                        command.Parameters.AddWithValue(parameterNames(i), Convert.ToDecimal(parameterVals(i)))
                    Else
                        command.Parameters.AddWithValue(parameterNames(i), parameterVals(i).ToString())
                    End If
                Next
            End If
        Catch ex As Exception
            Throw ex
        End Try
    End Sub

End Class

Nesta classe definimos métodos estáticos (Shared) para acessar informações do MySQL de forma que não precisaremos criar uma instância da classe AcessoBD.

Este é um exemplo de uma camada de acesso a dados bem simples usando ADO .NET.

Precisamos agora incluir uma referência ao namespace System.Configuration no projeto e definir a string de conexão no arquivo App.Config do projeto DAL e do projeto Windows Forms conforme mostrado a seguir:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory,
 MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="ConxaoMySQLDesenv" connectionString="Server=localhost;Port=3306;Database=cadastro;Uid=root;Pwd=gpxpst;" providerName="System.Data.MySqlClient" />   
  </connectionStrings>

</configuration>

Para concluir vamos incluir uma referência no projeto Windows Forms ao projeto DAL de forma a ter acesso à classe AcessoBD.

Clique com o botão direito sobre o projeto Windows Forms e a seguir em Add -> Reference;

Selecione o item Projects e marque o projeto DAL conforme abaixo:

Pronto. Agora já podemos implementar a persistência na camada de Interface.

Na próxima parte do artigo vamos implementar a persistência das informações no MySQL e recuperar as informações gravadas refletindo isso na camada de interface.

E agora, filhinhos, permanecei nele(Jesus); para que, quando ele se manifestar, tenhamos confiança, e não sejamos confundidos por ele na sua vinda1 João 2:28

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti