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
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo