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