Olá, nesta segunda parte do artigo iremos aprender como construir as classes filhas para acessar as bases de dados. No artigo passado, aprendemos como criar a classe mãe que irá agregar as funcionalidades de acesso aos bancos de dados.

 

Antes de irmos para o código, é necessário informar que, para facilitar a utilização de nossas classes, foi convencionado que todas as tabelas do banco de dados terão como chave primária um campo do tipo inteiro e auto incremento chamado de “id”.

 

Esclarecido isso, abra o projeto de DLL no Visual Basic 2010 Express que criamos no primeiro artigo, crie um nova classe com o nome clsMysql. Esta classe fará a conexão com o banco de dados MySql, para isso, é preciso adicionar as referências do projeto o conector .net para mysql que pode ser baixado no site da própria mysql: http://mysql.com/downloads/connector/net/

 

Para utilizarmos as funções do conector para mysql, é necessário importar o Namespace na classe, para isso declare antes do inicio da classe o seguinte:

 

Imports MySql.Data.MySqlClient

 

Depois, devemos dizer que a classe clsMysql é filha de clsDatabase da seguinte forma:

 

Public Class clsMysql

    Inherits clsDatabase

 

Com isso, os métodos que declaramos na classe mãe com o MustOverride na declaração do mesmo aparecerão automaticamente nesta classe. Vamos implementá-los. O primeiro método é o _AbreConexao.

 

    Public Overrides Function _AbreConexao() As Boolean

        Dim strConexao As New System.Text.StringBuilder

        Dim retorno As Boolean = False

 

        strConexao.Append(String.Format("server={0};user id={1};password={2};database={3};", dbServer, dbUser, dbPassword, dbBaseNome))

 

        Try

            dbConexao = New MySqlConnection(strConexao.ToString)

            dbConexao.Open()

            retorno = True

        Catch ex As Exception

            dbMensagem = ex.Message

        Finally

        End Try

 

        _AbreConexao = retorno

    End Function

 

Este método contém a string de conexão com o mysql que é a seguinte:

 

strConexao.Append(String.Format("server={0};user id={1};password={2};database={3};", dbServer, dbUser, dbPassword, dbBaseNome))

 

Só lembrando que as variáveis utilizadas nesta linha estão declaradas na classe mãe. O retorno da classe é o tipo booleano informando se conseguiu, ou não, abrir conexão com o mysql. O próximo método é o que fechará a conexão com o banco de dados.

 

    Public Overrides Function _FechaConexao() As Boolean

        Dim retorno As Boolean = True

        Try

            dbConexao.Close()

            dbConexao = Nothing

        Catch ex As Exception

            retorno = False

        End Try

        _FechaConexao = retorno

    End Function

 

O método abaixo serve para retorna uma variável de comando do mysql para iniciar a construção de instruções SQL.

 

    Public Overrides Function _getNewCommand() As IDbCommand

        _getNewCommand = New MySqlCommand

    End Function

 

O método a seguir serve para recuperar informações do banco de dados, através do comando SQL de Select.

 

    Public Overrides Function _pegarResultSet(ByVal vComando As IDbCommand) As DataTable

        _pegarResultSet = Nothing

 

        If dbConexao.State = ConnectionState.Open Then

            Dim Adapter As New MySqlDataAdapter

            Dim Tabela As New DataTable

 

            vComando.Connection = dbConexao

            With Adapter

                .SelectCommand = vComando

            End With

            Try

                Adapter.Fill(Tabela)

                _pegarResultSet = Tabela

            Catch ex As Exception

                dbMensagem = ex.Message

            End Try

            Adapter = Nothing

        Else

            dbMensagem = "Conexão com a base de dados foi perdida."

        End If

    End Function

 

É necessária uma variável do tipo IDbCommand como parâmetro já contendo o comando SQL necessário. Para obter a variável adequada para cada banco de dados é que foi criado o método getNewCommand. O método verifica se possui uma conexão aberta com a base de dados e tenta recuperar os dados.

 

O próximo método é o que obtém os meta dados de uma tabela do banco de dados.

 

    Public Overrides Function _pegarMetaDados(ByVal vComando As IDbCommand) As DataTable

        _pegarMetaDados = Nothing

 

        If dbConexao.State = ConnectionState.Open Then

            Dim Reader As MySqlDataReader

            Dim Tabela As New DataTable

 

            vComando.Connection = dbConexao

 

            Try

                Reader = vComando.ExecuteReader(CommandBehavior.KeyInfo)

                _pegarMetaDados = Reader.GetSchemaTable()

                Reader.Close()

            Catch ex As Exception

                dbMensagem = ex.Message

            End Try

            Reader = Nothing

 

        End If

    End Function

 

O método seguinte é utilizado quando se deseja utilizar comandos em Stored Procedures no banco de dados. O método adiciona os parâmetros na variável de comando do referido banco de dados.

 

    Public Overrides Sub _AdicionaParametro(ByVal pComando As System.Data.IDbCommand, ByVal pNome As String, ByVal pValor As Object, Optional ByVal pTipo As clsDatabase.TipoDeDados = -1, Optional ByVal pDirecao As System.Data.ParameterDirection = System.Data.ParameterDirection.Input, Optional ByVal pTamanho As Integer = 0, Optional ByVal pSourceColumn As String = "")

        Dim pParametro As New MySqlParameter

        With pParametro

            Select Case pTipo

                Case TipoDeDados.Data

                    .MySqlDbType = MySqlDbType.Date

                Case TipoDeDados.DataHora

                    .MySqlDbType = MySqlDbType.DateTime

                Case TipoDeDados.Hora

                    .MySqlDbType = MySqlDbType.Time

                Case TipoDeDados.Duplo

                Case TipoDeDados.Real

                    .MySqlDbType = MySqlDbType.Double

                Case TipoDeDados.Inteiro

                    .MySqlDbType = MySqlDbType.Int16

                Case TipoDeDados.Longo

                    .MySqlDbType = MySqlDbType.Int32

                Case TipoDeDados.Moeda

                    .MySqlDbType = MySqlDbType.Decimal

                Case TipoDeDados.Booleano

                    .MySqlDbType = MySqlDbType.Byte

                    If pValor = True Then

                        pValor = CType(1, Int32)

                    Else

                        pValor = CType(0, Int32)

                    End If

                Case TipoDeDados.Texto

                    .MySqlDbType = MySqlDbType.VarChar

                    .Size = pTamanho

                Case TipoDeDados.Caracter

                    .MySqlDbType = MySqlDbType.VarChar

                    .Size = 1

                Case TipoDeDados.TextoLongo

                    .MySqlDbType = MySqlDbType.String

                Case TipoDeDados.Imagem

                    .MySqlDbType = MySqlDbType.Blob

            End Select

            .Direction = pDirecao

            .ParameterName = pNome

            .Value = pValor

            .SourceColumn = pSourceColumn

        End With

        pComando.Parameters.Add(pParametro)

    End Sub

 

Aqui é onde se utiliza a enumeração dos tipos de dados criados na classe mãe. Por fim, o método que retorna o último id gerado na base de dados.

 

    Public Overrides Function _getLastInsertId(Optional ByVal pTableName As String = "") As Integer

        Dim spComando As IDbCommand

        Dim Resultado As Integer

 

        spComando = clsDatabase.getNewCommand

        spComando.CommandType = CommandType.Text

        spComando.CommandText = "select LAST_INSERT_ID(id) from " & pTableName & " order by id desc limit 1;"

 

        Resultado = clsDatabase.recuperaValor(spComando)

 

        spComando = Nothing

 

        Return Resultado

    End Function

 

Pronto! Terminamos a classe que se comunicará com o Mysql. Agora criaremos as classes de comunicação com o Access (clsAccess) e com o PostGres (clsPostgres). Como o .net já possui acesso nativo ao access, precisamos referenciar no projeto somente o conector com o postgres que pode ser baixado no site: http://npgsql.projects.postgresql.org/. O código das duas classes está abaixo

 

Access:

 

Imports System.Data.OleDb

 

Public Class clsAccess

    Inherits clsDatabase

 

    Public Overrides Function _AbreConexao() As Boolean

        Dim strConexao As New System.Text.StringBuilder

        Dim retorno As Boolean = False

 

        If String.IsNullOrEmpty(dbSegurancaOuSchema) Or String.IsNullOrEmpty(dbSegurancaOuSchema.Trim) Then

            strConexao.Append(String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};User ID={1};Password={2};", dbServer, dbUser, dbPassword))

        Else

            strConexao.Append(String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Jet OLEDB:System Database={1};User ID={2};Password={3};", dbServer, dbSegurancaOuSchema, dbUser, dbPassword))

        End If

 

        Try

            dbConexao = New OleDbConnection(strConexao.ToString)

            dbConexao.Open()

            retorno = True

        Catch ex As Exception

            dbMensagem = ex.Message

        Finally

        End Try

 

        _AbreConexao = retorno

    End Function

 

    Public Overrides Function _FechaConexao() As Boolean

        Dim retorno As Boolean = True

        Try

            dbConexao.Close()

            dbConexao = Nothing

        Catch ex As Exception

            retorno = False

        End Try

        _FechaConexao = retorno

    End Function

 

    Public Overrides Function _pegarResultSet(ByVal vComando As IDbCommand) As DataTable

        _pegarResultSet = Nothing

 

        If dbConexao.State = ConnectionState.Open Then

 

            Dim Adapter As New OleDbDataAdapter

            Dim Tabela As New DataTable

 

            vComando.Connection = dbConexao

            With Adapter

                .SelectCommand = vComando

            End With

            Try

                Adapter.Fill(Tabela)

                _pegarResultSet = Tabela

            Catch ex As Exception

                dbMensagem = ex.Message

            End Try

            Adapter = Nothing

 

        Else

            dbMensagem = "Conexão com a base de dados foi perdida."

        End If

    End Function

 

    Public Overrides Function _getNewCommand() As IDbCommand

        _getNewCommand = New OleDbCommand

    End Function

 

    Public Overrides Function _pegarMetaDados(ByVal vComando As IDbCommand) As DataTable

        _pegarMetaDados = Nothing

 

        If dbConexao.State = ConnectionState.Open Then

 

            Dim Adapter As New OleDbDataAdapter

            Dim Tabela As New DataTable

 

            vComando.Connection = dbConexao

            With Adapter

                .SelectCommand = vComando

            End With

            Try

                Adapter.FillSchema(Tabela, SchemaType.Source)

                _pegarMetaDados = Tabela

            Catch ex As Exception

                dbMensagem = ex.Message

            End Try

            Adapter = Nothing

        End If

    End Function

 

    Public Overrides Sub _AdicionaParametro(ByVal pComando As System.Data.IDbCommand, ByVal pNome As String, ByVal pValor As Object, Optional ByVal pTipo As clsDatabase.TipoDeDados = -1, Optional ByVal pDirecao As System.Data.ParameterDirection = System.Data.ParameterDirection.Input, Optional ByVal pTamanho As Integer = 0, Optional ByVal pSourceColumn As String = "")

        Dim pParametro As New OleDbParameter

 

        With pParametro

            Select Case pTipo

                Case -1

                    'Não faz nada

                Case TipoDeDados.Data

                    .OleDbType = OleDbType.Date

                Case TipoDeDados.DataHora

                    .OleDbType = OleDbType.DBTimeStamp

                Case TipoDeDados.Hora

                    .OleDbType = OleDbType.DBTime

                Case TipoDeDados.Inteiro

                    .OleDbType = OleDbType.Integer

                Case TipoDeDados.Longo

                    .OleDbType = OleDbType.Integer

                Case TipoDeDados.Real

                    .OleDbType = OleDbType.Decimal

                Case TipoDeDados.Moeda

                    .OleDbType = OleDbType.Decimal

                Case TipoDeDados.Booleano

                    .OleDbType = OleDbType.Boolean

                Case TipoDeDados.Texto

                    .OleDbType = OleDbType.VarChar

                    .Size = pTamanho

                Case TipoDeDados.Caracter

                    .OleDbType = OleDbType.Char

                    .Size = 1

                Case TipoDeDados.TextoLongo

                    .OleDbType = OleDbType.LongVarChar

                Case TipoDeDados.Imagem

                    .OleDbType = OleDbType.Variant

            End Select

            .Direction = pDirecao

            .ParameterName = pNome

            .Value = pValor

            .SourceColumn = pSourceColumn

        End With

        pComando.Parameters.Add(pParametro)

    End Sub

 

    Public Overrides Function _getLastInsertId(Optional ByVal pTableName As String = "") As Integer

        Dim spComando As IDbCommand

        Dim Resultado As Integer

 

        spComando = clsDatabase.getNewCommand

        spComando.CommandType = CommandType.Text

        spComando.CommandText = "SELECT @@IDENTITY"

 

        Resultado = clsDatabase.recuperaValor(spComando)

 

        spComando = Nothing

 

        Return Resultado

    End Function

 

End Class

 

Postgres:

 

Imports Npgsql

Imports NpgsqlTypes

 

Public Class clsPostgres

    Inherits clsDatabase

 

    Public Overrides Function _AbreConexao() As Boolean

        Dim strConexao As New System.Text.StringBuilder

        Dim retorno As Boolean = False

 

        strConexao.Append(String.Format("Server={0};Port=5432;UserId={1};Password={2};Database={3};", dbServer, dbUser, dbPassword, dbBaseNome))

 

        Try

            dbConexao = New NpgsqlConnection(strConexao.ToString)

            dbConexao.Open()

            retorno = True

        Catch ex As Exception

            dbMensagem = ex.Message

        Finally

        End Try

 

        _AbreConexao = retorno

    End Function

 

    Public Overrides Function _FechaConexao() As Boolean

        Dim retorno As Boolean = True

        Try

            dbConexao.Close()

            dbConexao = Nothing

        Catch ex As Exception

            retorno = False

        End Try

        _FechaConexao = retorno

    End Function

 

    Public Overrides Function _pegarResultSet(ByVal vComando As System.Data.IDbCommand) As System.Data.DataTable

        _pegarResultSet = Nothing

 

        If dbConexao.State = ConnectionState.Open Then

            Dim Adapter As New NpgsqlDataAdapter

            Dim Tabela As New DataTable

 

            vComando.Connection = dbConexao

            With Adapter

                .SelectCommand = vComando

            End With

            Try

                Adapter.Fill(Tabela)

                _pegarResultSet = Tabela

            Catch ex As Exception

                dbMensagem = ex.Message

            End Try

            Adapter = Nothing

        Else

            dbMensagem = "Conexão com a base de dados foi perdida."

        End If

    End Function

 

    Public Overrides Function _getNewCommand() As System.Data.IDbCommand

        _getNewCommand = New NpgsqlCommand

    End Function

 

    Public Overrides Function _pegarMetaDados(ByVal vComando As System.Data.IDbCommand) As System.Data.DataTable

        _pegarMetaDados = Nothing

 

        If dbConexao.State = ConnectionState.Open Then

            Dim Reader As NpgsqlDataReader

            Dim Tabela As New DataTable

 

            vComando.Connection = dbConexao

 

            Try

                Reader = vComando.ExecuteReader(CommandBehavior.KeyInfo)

                _pegarMetaDados = Reader.GetSchemaTable()

                Reader.Close()

            Catch ex As Exception

                dbMensagem = ex.Message

            End Try

            Reader = Nothing

        End If

    End Function

 

    Public Overrides Sub _AdicionaParametro(ByVal pComando As System.Data.IDbCommand, ByVal pNome As String, ByVal pValor As Object, Optional ByVal pTipo As clsDatabase.TipoDeDados = -1, Optional ByVal pDirecao As System.Data.ParameterDirection = System.Data.ParameterDirection.Input, Optional ByVal pTamanho As Integer = 0, Optional ByVal pSourceColumn As String = "")

        Dim pParametro As New NpgsqlParameter

        With pParametro

            Select Case pTipo

                Case TipoDeDados.Data

                    .NpgsqlDbType = NpgsqlDbType.Date

                Case TipoDeDados.DataHora

                    .NpgsqlDbType = NpgsqlDbType.Timestamp

                Case TipoDeDados.Hora

                    .NpgsqlDbType = NpgsqlDbType.Time

                Case TipoDeDados.Duplo

                Case TipoDeDados.Real

                    .NpgsqlDbType = NpgsqlDbType.Double

                Case TipoDeDados.Inteiro

                    .NpgsqlDbType = NpgsqlDbType.Integer

                Case TipoDeDados.Longo

                    .NpgsqlDbType = NpgsqlDbType.Integer

                Case TipoDeDados.Moeda

                    .NpgsqlDbType = NpgsqlDbType.Double

                Case TipoDeDados.Booleano

                    .NpgsqlDbType = NpgsqlDbType.Boolean

                Case TipoDeDados.Texto

                    .NpgsqlDbType = NpgsqlDbType.Varchar

                    .Size = pTamanho

                Case TipoDeDados.Caracter

                    .NpgsqlDbType = NpgsqlDbType.Varchar

                    .Size = 1

                Case TipoDeDados.TextoLongo

                    .NpgsqlDbType = NpgsqlDbType.Text

                Case TipoDeDados.Imagem

                    .NpgsqlDbType = NpgsqlDbType.Bytea

            End Select

            .Direction = pDirecao

            .ParameterName = pNome

            .Value = pValor

            .SourceColumn = pSourceColumn

        End With

        pComando.Parameters.Add(pParametro)

    End Sub

 

    Public Overrides Function _getLastInsertId(Optional ByVal pTableName As String = "") As Integer

        Dim spComando As IDbCommand

        Dim Resultado As Integer

 

        spComando = clsDatabase.getNewCommand

        spComando.CommandType = CommandType.Text

        spComando.CommandText = "SELECT last_value AS max FROM " & pTableName.ToLower & "_id_seq"

 

        Resultado = clsDatabase.recuperaValor(spComando)

 

        spComando = Nothing

 

        Return Resultado

    End Function

 

End Class

 

Com isso, nossas classes filhas estão prontas. Com o conhecimento adquirido aqui, você já é capaz de construir as classes para acessar outros bancos de dados, como: SqlServer, Firebird, Oracle e outros.

 

Em nosso último artigo, irei mostrar como aplicar a DLL criada neste projeto em uma aplicação.

 

Qualquer dúvida é só mandar um e-mail: domingosjunior87@gmail.com