Académique Documents
Professionnel Documents
Culture Documents
id=189
Artigo
Feed de artigos.
Como a maioria dos sistemas atuais necessitam de Base de Dados, sempre quando precisamos
acessar, inserir, alterar ou excluir um determinado registro, precisamos criar a conexo com a
Base de Dados, definir a query, os parmetros e escolher a opo para execut-la
(ExecuteNonQuery, ExecuteScalar ou ExecuteReader).
Para no ficarmos fazendo a todo momento todos esses passos, ou seja, criar conexo,
parmetros, etc., explicarei nesse artigo como criar um DALHelper. DALHelper quer dizer:
Data Application Layer (Camada de Dados) e Helper (Ajudante), que auxiliar no acesso aos
dados, reduzindo assim a quantidade de cdigo em nossa Aplicao.
Para isso criaremos uma Classe onde encapsularemos cdigo ADO.NET. S para recapitular,
Encapsulamento quando as funes internas de um determinado objeto no interessa ao
utilizador do mesmo, ou seja, temos a descrio das operaes que o objeto executa que
acessvel ao cliente, a implementao de tais operaes fica encapsulada e s visvel ao
prprio objeto.
Criaremos uma Windows Application chamada DALHelper e nela criaremos tambm um arquivo
chamado "DB.vb" onde ficar a nossa Classe chamada "DB" que ser responsvel pelo Acesso
aos Dados.
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data
Imports System.Data.SqlClient
Public Class DB
End Class
Public Class DB
End Class
1 de 8 03/05/2010 15:12
Linha de Cdigo - Criando um DALHelper (Data Application Layer - ... http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=189
A propriedade ConnectionString ser responsvel para receber a conexo com a Base de Dados
que dever ser informada pela Aplicao.
Cdigo 4 - ConnectionString.
O prximo passo criarmos os construtores da Classe. Aqui chamo a ateno para um detalhe:
criaremos duas opes para os contrutores (Overload ou Sobrecarga), para que j possamos
preencher as propriedades ConnectionString e ManterConexao.
Podemos reparar que no primeiro construtor, onde h apenas um nico parmetro, que nesse
caso a String de conexo com a Base de Dados. J no segundo construtor passada a String
de conexo e um valor Booelano que indicar se a conexo com a Base de Dados permanecer
aberta aps a execuo do comando.
Vamos criar uma Sub-Rotina para podermos fechar a conexo com a Base de Dados. Mas antes
de chamarmos o mtodo Close() da SqlConnection, devemos verificar se a varivel "conexao"
ainda encontra-se ativa.
Agora, veremos o mesmo mtodo (sobrecarregado) com mais um parmetro, que como
explicado acima, ser um Array contendo os parmetros que sero utilizados na Query ou
2 de 8 03/05/2010 15:12
Linha de Cdigo - Criando um DALHelper (Data Application Layer - ... http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=189
Stored Procedure:
Public Overloads Function ExecuteNonQuery(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal
ParamArray parameters() As SqlParameter) As Integer
Dim cmd As SqlCommand = CriarCommando(cmdText, cmdType, parameters)
Dim retVal As Integer
Try
If ManterConexao = False Then
retVal = cmd.ExecuteNonQuery()
Me.Fechar()
Else
retVal = cmd.ExecuteNonQuery()
End If
Return retVal
Catch e As Exception
Me.Fechar()
Throw e
End Try
End Function
Cdigo 9 - Criamos um objeto do tipo SqlCommand que ser responsvel pela execuo da Query ou Stored
Procedure e atribuimos a ele o retorno da Funo CriarCommando(), qual veremos mais adiante a sua utilidade e
funcionamento. Atente-se tambm condicional que feita para verificar se devemos ou no mantermos a
conexo com a Base de Dados aberta. E retornamos um inteiro que o nmero de registros afetados pela
instruo SQL.
Devemos fazer o mesmo para os que restaram: ExecuteScalar e ExecuteReader, mas temos que
prestar ateno no valor retorno dos mesmos. Vamos ento ver como funciona o ExecuteScalar:
Public Overloads Function ExecuteScalar(ByVal cmdText As String, ByVal cmdType As CommandType) As Object
Return ExecuteScalar(cmdText, cmdType, Nothing)
End Function
E a da mesma forma que fizemos com o ExecuteNonQuery quando ele necessita passar
parmetros para a Query ou Stored Procedure ser feito para o ExecuteScalar:
Public Overloads Function ExecuteScalar(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal
ParamArray parameters() As SqlParameter) As Object
Dim cmd As SqlCommand = CriarCommando(cmdText, cmdType, parameters)
Dim retVal As Object
Try
If ManterConexao = False Then
retVal = cmd.ExecuteScalar()
Me.Fechar()
Else
retVal = cmd.ExecuteScalar()
End If
Return retVal
Catch e As Exception
Me.Fechar()
Throw e
End Try
End Function
Cdigo 11 - A nica diferena alm do mtodo ser executado, o retorno do mesmo. Nesse quase ser
retornado um Object.
Public Overloads Function ExecuteReader(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal
ParamArray parameters() As SqlParameter) As SqlDataReader
Dim cmd As SqlCommand = CriarComando(cmdText, cmdType, parameters)
Return GetDataReader(cmd)
End Function
Cdigo 13 - A diferena entre esses dois mtodos so os parmetros que podem ou no serem necessrios para
a Query ou Stored Procedure. Reparem que feito da mesma forma que nos mtodos anteriores, ou seja,
3 de 8 03/05/2010 15:12
Linha de Cdigo - Criando um DALHelper (Data Application Layer - ... http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=189
criado um SqlCommand e chamamos a funo CriarComando. No retorno de ambas as funes, ele chama o
mtodo GetDataReader, passando o Command como parmetro.
Depois de todos esses passos devemos construir o mtodo CriarComando, que como o prprio
nome diz, cria e configura um SqlCommand informando o tipo (CommandType), a Query
(CommandText) e os parmetros (SqlParameter) quando necessrio.
Public Function CriarComando(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal ParamArray
parameters() As SqlParameter) As SqlCommand
Dim cmd As New SqlCommand(cmdText)
cmd.CommandType = cmdType
If Not (parameters Is Nothing) Then
Dim param As SqlParameter
For Each param In parameters
cmd.Parameters.Add(param)
Next param
End If
VerificarConexao(cmd)
Return cmd
End Function
Cdigo 14 - Atravs deste mtodo, definimos o Comando que ser executado (CommandText), o Tipo de
Comando (CommandType) e em seguida verificamos se h algum parmetro necessrio. Caso exista um ou mais
parmetros, realizado um lao For..Each atribuindo cada um coleo de parmetros do SqlCommand.
Podemos ver que ainda existe uma ltima Sub Rotina (VerificarConexao) para fecharmos essa
primeira parte, que tem por finalidade verificar e/ou criar a conexo com a Base de Dados.
Cdigo 15 - Aqui apenas fazemos a verificao com relao ao estado da conexo com a Base de Dados. Depois
apenas adicionamos propriedade Connection do objeto SqlCommand que vem como parmetro (ByRef).
Bem, depois de tudo isso, parece ser algo completamente complicado. Mas tentarei mostrar o
processo atravs de imagens.
4 de 8 03/05/2010 15:12
Linha de Cdigo - Criando um DALHelper (Data Application Layer - ... http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=189
Figura 2 - Neste caso, podemos ver que a conexo se mantm durante a execuo de vrias mtodos.
Ainda faltam trs funes que sero acessadas fora da Classe: CriarParametro, GetString e
GetInt32.
A funo CriarParametro servir para que possamos criar os parmetros que sero passados
para os mtodos que vimos anteriormente (ExecuteNonQuery, ExecuteScalar ou
ExecuteReader). Lembrando que os parmetros so passados como ParamArray.
Public Function CriarParametro(ByVal name As String, ByVal type As SqlDbType, ByVal value As Object) As
SqlParameter
Dim param As New SqlParameter()
param.ParameterName = name
param.SqlDbType = type
If value Is Nothing Then
param.Value = DBNull.Value
Else
If type = SqlDbType.VarChar And value.ToString().Length = 0 Then
param.Value = DBNull.Value
Else
param.Value = value
End If
End If
Return param
End Function
Cdigo 16 - A funo recebe o nome, tipo e valor do parmetro. Trata esses dados para que eles possam ser
adicionados coleo de parmetros do comando (SqlCommand).
Para finalizar temos apenas mais dois mtodos: GetString e GetInt32. Funes quais retornaro
valores em Strings e Inteiros, respectivamente do SqlDataReader. Ambas funes recebem
como parmetro o SqlDataReader e um nmero inteiro que representar o campo que ser
resgatado desse mesmo SqlDataReader:
Cdigo 17 - Tanto para o mtodo GetString quanto para o mtodo GetInt32 verificado se o campo solicitado
ou no nulo. Se no for, seu valor retornado, caso contrrio, no ser retornado nada.
OBS.: Podemos tambm criarmos os mtodos GetBoolean, GetDateTime, etc., mas nesse artigo
apenas usaremos os dois mtodos citados acima.
Enfim, nosso DALHelper pronto para ser colocado em ao. Criaremos ento duas Tabelas na
Base de Dados para test-lo. Abaixo a estrutura das Tabelas:
5 de 8 03/05/2010 15:12
Linha de Cdigo - Criando um DALHelper (Data Application Layer - ... http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=189
Temos tambm que criarmos um Formulrio para que possamos interagir com o Usurio. Abaixo
o formulrio que usaremos como exemplo:
Abaixo as Stored Procedures que utilizaremos no decorrer do nosso exemplo. Em um dos casos
utilizarei o cdigo SQL diretamente.
AS
SELECT
ClienteID,
Nome + ' - ' + Email AS DadosCliente
FROM
Clientes
ORDER BY
ClienteID ASC
GO
@Nome AS Varchar(50),
@Email AS Varchar(50)
AS
GO
Cdigo 18 - A primeira Stored Procedure retorna todos os Clientes. J a segunda ser utilizada para adicionarmos
um novo cliente.
Depois de nosso DALHelper pronto, as Tabelas da Base de Dados e das Stored Procedures
vamos comear a codificar o Front-End. Primeiramente incluirei mais dois WinForm ao Projeto
para que possamos entender os dois casos como vimos acima.
6 de 8 03/05/2010 15:12
Linha de Cdigo - Criando um DALHelper (Data Application Layer - ... http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=189
Vamos analisar a Sub-Rotina CarregaListBox que ser responsvel por carregar os dados da
Base de Dados (Tabela Clientes) no ListBox:
Cdigo 19 - No construtor da Classe DB passamos como parmetro a ConnectionString que est armazenada em
uma constante declarada no topo do WinForm e o segundo parmetro diz que aps efetuar o comando deve ser
fechada a conexo com a Base de Dados.
Podemos ver que aps instanciarmos a Classe DB, podemos utilizar seus mtodos e
propriedades. No cdigo acima, criamos um SqlDataReader e atribumos ele o retorno da
funo ExecuteReader que recebe como parmetro o Nome do Stored Procedure ou Query e o
CommandType, que por sua vez tambm retorna um SqlDataReader. Atravs de um lao While
percorremos o SqlDataReader e adicionamos cada registro ao ListBox. Utilizamos o GetInt32
quando o campo ser resgatado do SqlDataReader do tipo Inteiro, j o GetString o utilizamos
quando o campo do tipo Texto.
No evento Click do boto Adicionar devemos incluir um novo registro no Base de Dados e logo
aps fecharmos a conexo com a mesma. Veja o cdigo:
Cdigo 20 - Ao clicarmos no boto para adicionarmos um novo registro na Base de Dados, instanciamos a Classe
DB e novamente informamos ela a ConnectionString e dizemos atravs do segundo parmetro que aps a
execuo, deve ser fechada a conexo com a Base de Dados, criamos uma varivel chamada param() que ser
um Array de SqlParameter e utilizamos o mtodo ExecuteNonQuery.
Com o Array podemos incluir quantos parmetros forem necessrios. Basta utilizar o mtodo
CriarParametro e informar o Nome, o Tipo de Dados e o Valor, separando cada um por uma
vrgula ( , ). No caso desse exemplo, os dois parmetros so do Tipo Varchar e recebem os
TextBox que esto no WinForm.
Agora iremos alterar a rotina que adiciona um novo registro. Vamos manter a conexo aberta
durante a executao de duas instrues SQL. Para isso, aps a execuo da Stored Procedure
AdicionarCliente, vamos adicionar Tabela Logs um novo registro e para isso utilizaremos a
mesma conexo, apenas mudando o CommandType:
7 de 8 03/05/2010 15:12
Linha de Cdigo - Criando um DALHelper (Data Application Layer - ... http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=189
Cdigo 21 - A diferena aqui se encontra no segundo parmetro que informado ao construtor da Classe DB, que
nesse caso True, que diz que depois de executar o comando, a conexo deve permanecer aberta.
Neste caso informamos a Query diretamente, ou seja, sem Stored Procedures. O procedimento
o mesmo, apenas temos que mudar o CommandType para CommandType.Text. A criao de
parmetros continua sendo da mesma forma das Stored Procedures, ou seja, utilizando o
mtodo CriarParametro.
Um dos principais cuidados que devemos ter quando mantermos a conexo aberta, que aps
finalizarmos todo o processo, devemos fechar a conexo com a Base de Dados explicitamente
atravs do mtodo Fechar().
OBS.: Procure no deixar a String de Conexo com a Base de Dados em Hard-Code, ou seja,
deix-la juntamente com o cdigo, pois isso implicaria em cada vez que mudar a Base de
Dados/String de Conexo, recompilar a aplicao.
Concluso: Utilizando o DALHelper escrevemos muito menos cdigo do que quando utilizamos
as declaraes de SqlCommand, SqlParameter, SqlCommand, etc. normalmente, pois todos
esses cdigos ADO.NET j esto encapsulados dentro do DALHelper. Podemos tambm definir o
Tipo de Comando (CommandType), manter a conexo aberta ou no aps a execuo de um
comando, entre outras funcionalidades/facilidades.
Copyright 2001-2010 Codeline Editora, Comrcio e Tecnologia Ltda. | Poltica de privacidade e de uso | Anuncie | Fale conosco
8 de 8 03/05/2010 15:12