Como criar acesso genérico a banco de dados - Parte 2

Nesta segunda parte do artigo iremos aprender como construir as classes filhas para acessar as bases de dados.

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=;user id=;password=;database=;", 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=;user id=;password=;database=;", 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=;User ID=;Password=;", dbServer, dbUser, dbPassword))

Else

strConexao.Append(String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=;Jet OLEDB:System Database=;User ID=;Password=;", 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=;Port=5432;UserId=;Password=;Database=;", 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

Ebook exclusivo
Dê um upgrade no início da sua jornada. Crie sua conta grátis e baixe o e-book

Artigos relacionados