You are on page 1of 35

Neste artIgo eu vou mostrar (novcmente) como gerencIar um banco

de dados $" efetuando as operaes /e ccesso, seleo, ncluso


, clterco e excluso usando a IInguagem C# e A0D .NET.
'amos trabalhar usando a arquItetura em J camadas defInIndo assIm:
O camada de Interface : U ncmespcce 0l
O camada de negocIos : 8LL ncmespcce 8LL e clcsse
pro/uto8LL
O camada de acesso a dados : 0L ncmespcce 0AL e clcsse
pro/uto0AL
'amos tambm crIar a entIdade Produto que ser o objeto do nosso
negocIo e que possuIr J proprIedades: 0, Nome e
Preco representando assIm cada coluna da tabela Estoque.
entIdade ter o namespace 0TD e a classe Produto.
u poderIa crIar J projetos dIstIntos mas para sImplIfIcar vou crIar as
seguIntes classes :
O 5roduto contm os mtodos das regras de
negocIo; ncmespcce 8LL)
O 5roduto0A Contm os mtodos para acesso a dados no
|ySQL; ncmespcce 0AL)
O 5roduto contm a classe Produto; ncmespcce 0TD)
O & representa a nossa aplIcao WIndows Forms;
Lembrando que em uma aplIcao em J camadas temos uma
hIerarquIa de chamadas onde :
& chama a que chama a 0 que por sua vez acesso os dados
e retorna os objetos;
Nunca dever haver uma chamada dIreta da U para a 0L e vIce
versa.("ucn/o uscmos os controles /e ccesso c /c/os vnculc/os no
]ormulcro estcmos ]czen/o o ccesso /reto /c ccmc/c /e nter]cce
pcrc c 0AL ou bcnco /e /c/os o que no umc boc prctcc.)
s ferramentas usadas so:
O 8anco de dados |ySQL
5.01; http://dev.mysql.com/downloads/mysql/5.1.html
O |ySQL dmInIstrator e $" "uer rowse
http://dev.mysql.com/downloads/guItools/5.0.html;
O |ySQL Connector .N%
6.04; http://dev.mysql.com/downloads/connector/
O Sharp0evelop J.0 ou Vsual Studo C#
2008; http://www.Icsharpcode.net/DpenSource/S0/0ownload
/ ou http://www.mIcrosoft.com/express/vcsharp/
Se voc no possuIr o $" e o Connector .NET para o |ySQL
dever efetuar o downIoad e Instalar. Instalao sImples basta
clIcar no pacote e seguIr as orIentaes aceItando as confIguraes
padro. 'eja a seguIr a sequncIa de telas prIncIpaIs da Instalao:

1tela InIcIal de Instalao do |ySQL
2SelecIone a opo T5IcaI para
Instalao

J'erIfIque o local onde os arquIvos sero
Instalados
4|arque a opo para confIgurar o
|ySQL

5|arque a opo $tandard
ConfIguratIon
6|arque a opo para Instalar como um
servIo e fornea um nome para o
servIo. D nome padro $"

nforme uma senha ao usurIo root
ClIque no boto Execute para processar
as opes defInIdas
Com os componentes Instalados vamos efetuar as seguIntes tarefas:
O CrIar um banco de dados no |ySQL Chamado Cadastro e uma
tabela chamada Estoque com os campos 0, Nome e Preco;
O CrIar um novo projeto WIndows Forms no 'IsuaI C# 2008
Ex5ress ou $har50eveIo5;
mbora eu j tenha descrIto como crIar um banco de dados no |ySQL
usando |ySQL dmInIstrator vou resumIdamente repetIr os passos:
O bra o $" AdmInInIstrator, e, na rea InferIor esquerda,
onde so exIbIdos os esquemas. clIque com o boto dIreIto e
selecIone a opo : Create New $chema;
O Na janela Create new $chema e Informe o nome do banco de
dados , no nosso caso, Cadastro, e tecle DK;
O ClIque sobre o esquema crIado e selecIone a opo Create New
TabIe ou clIque no boto Create TabIe;
O seguIr defIna o nome da tabela como Estoque e defIna os
campos da mesma conforme a fIgura abaIxo:

O seguIr a partIr do menu TooIs selecIone a opo $"


"uer rowse;
O Na janela do $" "uer rowse dIgIte a Instruo NS#%
N%D stoque 'LUS (',Caderno, 1.2J) e clIque no
boto Execute para IncluIr um regIstro na tabela. #epIta a
operao e Inclua uma borracha com um valor de forma que ao
efetuar uma Instruo SLC% * F#D| stoque Iremos obter o
resultado abaIxo;
Neste momento j temos o banco de dados Cadastro e a
tabela Estoque com doIs regIstros.
bra o Sharp0evelop ou o 'Isual C# 200 xpress e crIe um novo
projeto do tIpo n/ows Applccton com o nome $"*C#;
0evemos IncluIr a referncIa ao Connector .NET para ter acesso as
classes de acesso a dados do $". Para Isso clIque sobre o nome
do projeto e selecIone a opo Add Peference;
seguIr Inclua uma referncIa a dll do $" Connector
.NET selecIonando na pasta onde foI Instalado e clIcando no
boto AbrIrlD5en;

No formulrIo padro Inclua um controle TabControI e defIna


doIs TabPages:
O %abPage1 %ext = Cadastro
O %abPage2 %ext = Ista
O tabControI1 - A55earence = FIatuttons pcrc obter c
cpcrncc con]orme c ]yurc cbcxo)

Na prImeIra TabPage Inclua os seguIntes controles:


O J controles Label
O J Controles %ext8ox :txt0, txtNome e txtPreco
O 5 controles 8utton : btnNovo, btnAItear, btnExcIuIr, btnExIbIr
e btnProcurar
Na segunda TabPage Inclua um controle 0ataCrId'Iew
gdvProdutos.
cIma vemos o leIaute do formulrIo para cada TabPage.
'amos InIcIar crIando o arquIvo de classe Produto.cs que Ir
representar a classe Produto, clIcando no nome do projeto e
selecIonando a opo Add New tem;
Na janela de templates selecIone o template CIass e Informe o
nome Produto.cs;
seguIr defIna o seguInte codIgo nesta classe onde estamos defInIndo
J membros e J proprIedades da nossa entIdade Produto:
usIng System;

names5ace 0TD
[
5ubIIc cIass Produto
[
Int _Id;
StrIng _nome;
0ecImal _preco;

publIc Int 0
[
get [return _Id;]
set [_Id = value;]
]
publIc StrIng Nome
[
get [return _nome;]
set [_nome = value;]
]
publIc 0ecImal Preco
[
get [return _preco;]
set [_preco = value;]
]
]
]
Neste arquIvo crIamos a classe Produto e defInImos os membros *Id,
*nome e *5reco e as proprIedades 0, Nome e Preco. la ser usada
para transferncIa de objetos entre as camadas de Interface de
negocIo e de acesso a dados.
gora vamos crIar o arquIvo de classe 0A.cs clIcando no nome do
projeto e selecIonando a opo Add New tem;
Na janela de templctes selecIone o templcte CIass e Informe o
nome 0A.cs;
Ds pacotes usados nesta classe so:
usIng $stem;
usIng $stem.CoIIectIons.CenerIc;
usIng $stem.0ata;
usIng $qI.0ata.$qICIIent;
usIng 0TD;
seguIr vamos defInIr na classe 5roduto0A 6 mtodos conforme
exIbIdos abaIxo:
O seIectIstProdutos retorna uma lIsta de produtos
: IstProduto> com os produtos selecIonados;
O seIectProdutos retorna um 0ataTabIe com os produtos
selecIonados;
O seIectProdutos0 retorna uma entIdade Produto para um
produto selecIonado pelo seu codIgo (Id);
O InsertProduto IncluI um novo produto;
O u5dateProduto atualIza um produto exIstente;
O deIeteProduto excluI um produto exIstente;
'ejamos o codIgo da classe 5roduto0A:
0eclaramos duas varIveIs que sero vIsiveIs na classe:
$trIng *conexao$" = "";
$qIConnectIon con = nuII;
D construtor da classe Produto0A defIne a strIng de conexo com o
banco de dados $":
publIc produto0L()
[
*conexao$" = server=localhost;user
Id=root;password=password;database=cadastro;
]
onde temos:
server localhost , poIs estou acessando o |ySQL Instalado na mInha
mquIna local;
Id = root , poIs estou usando o usurIo root;
5assword = pcsswor/ , poIs essa foI a senha defInIda para o usurIo
root;
database=cadastro, poIs esse o banco de dados que crIamos no
|ySQL;
gora vejamos os mtodos:
1 $eIectProdutos Usada para exIbIr todos os produtos do estoque;
publIc 0ata%able selectProdutos()[
try[
StrIng sql = "$EECT * FPD Estoque";
con = new |ySqlConnectIon(_conexao|ySQL);
|ySqlCommand cmd = new |ySqlCommand(sql,con);
|ySql0atadapter da = new |ySql0atadapter();
da.SelectCommand = cmd;
0ataTabIe dt = new 0ataTabIe();
da.FIll(dt);
return dt;
]
catch (xceptIon ex)
[
throw ex;
]
]
2 seIecteProduto0() Usada para retornar uma
entIdade Produto representando um unIco produto pelo seu codIgo
(Id);
publIc Produto selectProduto8y0(Int Id)
[
try[
StrIng sql = SLC% * F#D| stoque WH# Id = @Id;
con = new |ySqlConnectIon(_conexao|ySQL);
|ySqlCommand cmd = new |ySqlCommand(sql,con);
cmd.Parameters.ddWIth'alue(@Id,Id);
con.Dpen();
|ySql0ata#eader dr;

Produto produto = new Produto();
dr =
cmd.xecute#eader(Command8ehavIor.CloseConnectIon);

whIle (dr.#ead()) [
produto.0 = Convert.%ontJ2(dr[Id]);
produto.Nome = dr[Nome].%oStrIng();
produto.Preco = Convert.%o0ecImal(dr[Preco]);
]
return produto;
]
catch (xceptIon ex)
[
throw ex;
]
]

J seIectIstProdutos() Usada para retornar uma lIsta de


objetos Produto representando uma coleo de produtos.
publIc LIstProduto selectLIstProdutos()
[
try [
usIng (|ySqlConnectIon conn = new
|ySqlConnectIon(_conexao|ySQL)) [
usIng (|ySqlCommand command = new
|ySqlCommand("$eIect * from Estoque",
conn))
[
conn.Dpen();
IstProduto> IIstaProdutos = new
IstProduto>();
usIng (|ySql0ata#eader dr =
command.xecute#eader())
[
whIle (dr.#ead()) [
Produto produto = new
Produto();
produto.0 = (Int)dr[Id];
produto.Nome = (StrIng)
dr[Nome];
produto.Preco =
Convert.%o0ecImal(dr[Preco]);
lIstaProdutos.dd(produto);
]
]
return IIstaProdutos;
]
]
]
catch (xceptIon ex) [
throw new xceptIon(rro ao acessar
estoque + ex.|essage);
]
]
4 InsertProduto() Usada para IncluIr um novo produto no estoque;
publIc voId InsertProduto(Produto produto)[
try[
StrIng sql = "N$EPT NTD Estoque (nome,5reco)
'A&E$ (@nome,@5reco)";
con = new |ySqlConnectIon(_conexao|ySQL);
|ySqlCommand cmd = new |ySqlCommand(sql,con);
cmd.Parameters.ddWIth'alue(@nome,produto.Nome);
cmd.Parameters.ddWIth'alue(@preco,produto.Preco);
con.Dpen();
cmd.ExecuteNon"uer();
]
catch (xceptIon ex)
[
throw ex;
]
fInally[
con.Close();
]
]
5 u5dateProduto() Usada para atualIzar os dados de um produto
no estoque;
publIc voId updateProduto(Produto produto)[
try[
StrIng sql = &P0ATE Estoque $ET nome= @nome
,5reco=@5reco WHEPE Id = @Id ";
con = new |ySqlConnectIon(_conexao|ySQL);
|ySqlCommand cmd = new |ySqlCommand(sql,con);
cmd.Parameters.ddWIth'alue(@Id,produto.0);

cmd.Parameters.ddWIth'alue(@nome,produto.Nome);
cmd.Parameters.ddWIth'alue(@preco,produto.Preco);
con.Dpen();
cmd.ExecuteNon"uer();
]
catch (xceptIon ex)
[
throw ex;
]
fInally[
con.Close();
]
]
6 deIeteProduto() Usada para excluIr um produto no estoque;
publIc voId deleteProduto(Produto produto)[
try[
StrIng sql = "0EETE FPD Estoque WHEPE Id =
@Id ";
|ySqlConnectIon con = new
|ySqlConnectIon(_conexao|ySQL);
|ySqlCommand cmd = new
|ySqlCommand(sql,con);
cmd.Parameters.ddWIth'alue(@Id,produto.0);
con.Dpen();
cmd.ExecuteNon"uer();
]
catch (xceptIon ex)
[
throw ex;
]
fInally[
con.Close();
]
]
u mantIve o codIgo o maIs sImples possivel usando 0D .N%
clssIca e Instrues SQL. PoderIa ter usado stored 5rocedures o que
serIa maIs IndIcado.
sta a nossa camada de acesso a dados e sua responsabIlIdade e
acessar e persIstIr dados no $", so Isso. 'eja abaIxo uma fIgura
onde temos uma vIso da nossa soluo:

stamos usando a arquItetura em J camadas defInIda assIm:


O camada de Interface : U ncmespcce 0l
O camada de negocIos : 8LL ncmespcce 8LL e clcsse
pro/uto8LL
O camada de acesso a dados : 0L ncmespcce 0AL e clcsse
pro/uto0AL
m uma aplIcao em J camadas temos uma hIerarquIa de chamadas
onde :
& chama a que chama a 0A que por sua vez acesso os dados
e retorna os objetos;
Nunca dever haver uma chamada dIreta da U para a 0L e vIce
versa.("uando usamos os controles de acesso a dados vnculados
no jormulro estamos jazendo o acesso dreto da camada de
nterjace ara a 0AL ou banco de dados o que no uma boa
rtca.)
Nosso projeto possuI a seguInte estrutura:
O 5roduto contm os mtodos das regras de
negocIo; ncmespcce 8LL)
O 5roduto0A Contm os mtodos para acesso a dados no
|ySQL; ncmespcce 0AL)
O 5roduto contm a classe Produto; ncmespcce 0TD)
O & representa a nossa aplIcao WIndows Forms;
Dnde j Implementamos a classe 5roduto0A na camada 0A.
'amos agora mostrar a defInIo da camada onde temos a
classe 5roduto. classe 5roduto possuI os seguIntes
mtodos:
O 0ataTabIe seIecIonaProdutos() - retorna todos os produtos ;
O novoProduto(Produto 5roduto) IncluI um novo produto;
O aIteraProduto(Produto 5roduto) altera os dados de um
produto; a
O excIuIProduto(Produto 5roduto) excluI um produto;
O IstProduto> IIstaProdutos() retorna uma lIsta genrIca de
produtos;
O Produto IIstaProdutoPor0(Int Id) retorna um unIco produto;
Conforme mostrado na fIgura a seguIr:
'ejamos o codIgo da classe 5roduto:
0evemos declarar os seguIntes namespaces nos Imports:
usIng $stem.CoIIectIons.CenerIc;
usIng $stem;
usIng 0A;
usIng 0TD;
usIng $stem.0ata;
PrecIsamos da referncIa a camada 0L para acessar os mtodos da
classe 5roduto0A e da referncIa a camada 0TD para acessar as
proprIedades da entIdade Produto. referncIa aCenerIc devese ao
fato de estarmos retornando uma lIsta genrIca de produtos no
mtodo IIstaProdutos();
D construtor da classe Produto esta vazIo:
publIc produto8LL()
[]
gora vejamos os mtodos:
1 seIecIonaProdutos() retorna um datatabIe com todos os
produtos usando o mtodo seIectProdutos() da camada 0A;
publIc 0ata%able selecIonaProdutos()
[
0ata%able tb = new 0ata%able();
try[
dal = new 0L.produto0L();
tb = dal.selectProdutos();
]
catch (xceptIon ex)
[
throw ex;
]
return tb;
]
2 IIstaProdutoPor0() Usada para retornar uma
entIdade Produto representando um unIco produto pelo seu codIgo
(Id) atravs do mtodo seIectProduto0() da camada 0L;
publIc Produto lIstaProdutoPor0(Int Id)
[
try[
dal = new produto0L();
return dal.selectProduto8y0(Id);
]catch (xceptIon ex) [
throw ex;
]
]
J IIstaProdutos() Usada para retornar uma lIsta de objetos
Produto representando uma coleo de produtos usando o
mtodo seIectIstProdutos() da camada 0L;
publIc LIstProduto
lIstaProdutos()
[
try[
dal = new produto0L();

return dal.selectLIstProdutos();
]catch (xceptIon ex) [
throw ex;
]
]
4 novoProduto(Produto 5roduto) Usada para IncluIr um novo
produto no estoque usando o mtodo InsertProduto() da camada
0L;
publIc voId novoProduto(Produto produto)[
try[
dal = new 0L.produto0L();
dal.InsertProduto(produto);
]catch (xceptIon ex) [
throw ex;
]
]
5 u5dateProduto() Usada para atualIzar os dados de um produto
no estoque atravs do mtodo u5dateProduto() da camada 0L;
publIc voId alteraProduto(Produto produto)[
try[
dal = new 0L.produto0L();
dal.updateProduto(produto);
]catch (xceptIon ex) [
throw ex;
]
]
6 deIeteProduto() Usada para excluIr um produto no estoque vIa
mtodo deIeteProduto() da camada 0L;
publIc voId excluIProduto(Produto produto)[
try[
dal = new produto0L();
dal.deleteProduto(produto);
]catch (xceptIon ex) [
throw ex;
]
]
No estamos efetuando nenhuma valIdao de negocIo nessas classes
devIdo a sImplIcIdade do exemplo mas em um sIstema de produo
aquI teriamos as valIdaes referente ao negocIo como restrIes de
valores, clculo de Impostos, descontos, etc.
0essa forma concluimos a defInIo do codIgo da nossa camada de
negocIos atravs da Implementao dos mtodos da
classe 5roduto.

stamos usando uma arquItetura em J camadas defInIda assIm:


O camada de Interface : & ncmespcce 0l
O camada de negocIos : ncmespcce 8LL e clcsse
pro/uto8LL
O camada de acesso a dados : 0A ncmespcce 0AL e clcsse
pro/uto0AL
O classe Produto que representa um produto do nosso dominIo;
nossa camada de Interface ser uma aplIcao n/ows Forms que
possuI um formulrIo onde atravs de um
componente TabControI podemos obter uma vIso com detalhes do
produto e outra vIso da relao dos produtos cadastrados conforme
as fIguras a seguIr:

Para crIar esta Interface Inclua o controle TabControI a partIr


da TooIox e na sua proprIedade TabPages clIque no boto ao lado
de CoIIectIon e defIna duas TabPages defInIndo a proprIedade nome
da prImeIra TcbPcye1 como sendo Igual a Cadastro e da segunda
TcbPcye2 como Ista:

nclua o controle TabControI e defIna a sua proprIedade


A55earence como Igual a FIatuttons;
Na TabPage Cadastro Inclua os seguIntes controles a
partIr da TooIox:
abeI
- Textox - txt0 , txtNome e txtPreco
- 4 utton - btnNovo, btnAIterar, btnExcIuIr, btnExIbI
Na TabPge LIsta Inclua o componente 0ataCrId'Iew -
gdvProdutos

Com Isso temos a nossa Interface pronta para ser usada. Fazemos Isso
acessando os dados da base $" e fazendo uma chamada a nossa
camada de negocIo (8LL) que por sua vez chama a camada de acesso
a dados(0L) que responsvel por recuperar e persIstIr Informao
na base de dados.
'amos usar os eventos dos controles de formulrIo utton para fazer
a chamada a nossa classe de negocIo. Para Isso no InicIo do nosso
formulrIo devemos ter as seguIntes referncIas:
usIng$stem;
usIng$stem.CoIIectIons.CenerIc;
usIng$stem.0rawIng;
usIng$stem.WIndows.Forms;
usIng;
usIng0TD;
Note que temos que ter uma referncIa a camada de negocIos a
nossa camada 0TD 0ata Transfer Dbject, onde defInImos a
classe Produto.
'amos comear com o evento CIIck do boto ExIbIr que Ir exIbIr os
dados na TabPage Ista em um 0ataCrId'Iew;

voId 8tnxIbIrClIck(object sender, ventrgs e)


[
try[
8LL.produto8LL bll = new produto8LL();
gdvProdutos.0ataSource =
bll.selecIonaProdutos();
]catch (xceptIon ex)[
|essage8ox.Show( rro : +
ex.|essage.%oStrIng());
]
]
Neste codIgo crIamos uma InstncIa da classe Produto() e em
seguIda usamos o mtodo seIecIonaProdutos() que Ir retornar
um 0ataTabIe e exIbIr os produtos no 0ataCrId'Iew.
'ejamos agora o codIgo do evento CIIck do boto Novo :
voId 8tnNovoClIck(object sender, ventrgs e)
[
Produto p = new Produto();
p.Nome = (StrIng) txtNome.%ext;
p.Preco = Convert.%o0ecImal(txtPreco.%ext);
try[
8LL.produto8LL bll = new produto8LL();
bll.novoProduto(p);
]
catch (xceptIon ex)
[
|essage8ox.Show( rro : + ex.|essage.%oStrIng());
]
]

PrImeIro crIamos uma InstncIa da classe Produto e defInImos as


proprIedades Nome e Preco atrIbuIndo a elas os valores fornecIdos
pelo usurIo atravs das caIxas de texto txtNome e txtPreco. No
precIsamos Informar o codIgo do produto(0) poIs o mesmo
controlado pelo $C0 vIsto que defInImos este campo como do
tIpo IdentIt.
seguIr crIamos uma InstncIa da classe Produto()
no ncmespcce 8LL e em seguIda usamos o mtodo novoProduto(p)
para IncluIr um novo produto na base de dados. Dbserve que
passamos como parmetro um objeto produto e no valores
escalares.
seguIr temos o codIgo assocIado ao evento CIIck do boto AIterar:
voId 8tnlterarClIck(object sender, ventrgs e)
[
Produto p = new Produto();
p.0 = Convert.%ontJ2(txt0.%ext);
p.Nome = (StrIng) txtNome.%ext;
p.Preco = Convert.%o0ecImal(txtPreco.%ext);

try[
8LL.produto8LL bll = new produto8LL();
bll.alteraProduto(p);
]
catch (xceptIon ex)
[
|essage8ox.Show( rro : + ex.|essage.%oStrIng());
]
]

PrImeIro crIamos uma InstncIa da classe Produto e defInImos as


proprIedades 0, Nome e Preco atrIbuIndo a elas os valores
fornecIdos pelo usurIo atravs das caIxas de texto txt0, txtNome e
txtPreco. quI precIsamos Informar o 0 do produto para IdentIfIcar
o produto a ser alterado.
seguIr crIamos uma InstncIa da classe Produto()
no ncmespcce 8LL e em seguIda usamos o mtodo aIteraProduto(p)
para alterar um produto na base de dados. Dbserve que passamos
como parmetro um objeto produto e no valores escalares.
'ejamos agora o codIgo do evento CIIck do boto ExcIuIr:

voId 8tnxcluIrClIck(object sender, ventrgs e)


[
Produto p = new Produto();
p.0 = Convert.%ontJ2(txt0.%ext);
try[
8LL.produto8LL bll = new produto8LL();
bll.excluIProduto(p);
]
catch (xceptIon ex)
[
|essage8ox.Show( rro : +
ex.|essage.%oStrIng());
]
]
PrImeIro crIamos uma InstncIa da classe Produto e defInImos a
proprIedade 0 atrIbuIndo a ela o valor fornecIdo pelo usurIo atravs
das caIxas de texto txt0.
seguIr crIamos uma InstncIa da classe Produto()
no ncmespcce 8LL e em seguIda usamos o mtodo excIuIProduto(p)
para excluIr um produto na base de dados IdentIfIcado pelo
parmetro 0 Informado.
FInalmente temos o codIgo do boto Procurar:
voId 8tnProcurarClIck(object sender, ventrgs e)
[
Int Id = Convert.%ontJ2(txt0.%ext);
Produto p = new Produto();
try[
8LL.produto8LL bll = new produto8LL();
p = bll.lIstaProdutoPor0(Id);
txtNome.%ext = p.Nome;
txtPreco.%ext = p.Preco.%oStrIng();
]
catch (xceptIon ex)
[
|essage8ox.Show( rro : +
ex.|essage.%oStrIng());
]
]

Neste codIgo obtemos o codIgo do produto (0) a partIr da caIxa de


texto txt0.Text. seguIr crIamos uma InstncIa da classe Produto()
e Invocamos o mtodo IIstaProdutoPor0usando o Id obtIdo; por fIm
exIbImos os dados do produto no formulrIo.
Com Isso encerramos a nossa aplIcao que acessa o $" usando
uma arquItetura em camadas. plIcamos os conceItos bsIcos da
orIentao a objetos mas podemos Ir alm, poIs usamos na
camada 0TD uma classe anmIca sem nenhuma IntelIgncIa e no
usamos o conceIto de Interface neste projeto. 0eIxo Isso para voc
como um exercicIo.

u vou usar os seguIntes recursos:


1 MySQL 5.0 (Comunity Server) 8aIxe e Instale usando as
confIguraes padro sugerIdas pelo assIstente de Instalao;
2 MySQL Administrator e MySQL Query Browser 8aIxe e Instale
usando o assIstente;
J SharpDevelop 2.2 ou Visual C# Express Edition
Para efetuar a conexo usando C# vamos usar provedor 0D .N%
para $" :
4 Download Connector/Net 5.1 (Po/emos uscr tcmbm c verso 5.2)
CrIando o banco de dados e a tabeIa
pos fazer o download e Instalar as ferramentas IndIcadas vamos
crIar um novo banco de dados chamado Cadastro no |ySQL.
bra o $" AdmInIstrator e clIque em CataIogs;
seguIr clIque com o boto dIreIto do mouse na rea onde so
exIbIdos os banco de dados e selecIone Create New $chema;
nforme o nome do banco de dados e a seguIr clIque no boto Create
TabIe;
seguIr Informe o nome da tabela ClIentes e defIna as colunas: Id ,
nome, endereo e emaII conforme abaIxo;
Para IncluIr alguns dados na tabela abra o $" "uer rowser e
dIgIte a Instruo N$EPT NTD conforme fIgura abaIxo e clIque em
xecute;
N$EPT NTD CIIentes(nome,endereco, emaII) vaIues ('JanIce', 'Pa
da uz, 54', 'janice@boI.com.br')
D campo Id foI defInIdo como chave prImrIa e Incremental de forma
que o seu valor atrIbuido pelo |ySQL;
o fInal teremos o banco de dados Cadastro e a tabela CIIentes com
alguns dados no $". stamos prontos para comear.
'amos agora crIar uma nova soluo chamada $"Exem5Io usando
o $har50eveIo5.
bra o $har50eveIo5 e no menu ArquIvo selecIone Novo e em
seguIda $oIuo;

Na janela Novo Projeto selecIone C#->A5IIcaes WIndows e na


janela odeIos marque A5IIcao WIndows e Informe o nome da
soluo , no meu caso: $"Exem5Io;

No formulrIo padro aInForm.cs vamos IncluIr um


controle 0ataCrId a partIr da guIa 0ata na janela de Ferramentas:

Na janela de codIgo vamos prImeIro


declarar os namespaces:

usIng System.0ata;
usIng |ySql.0ata.|ySqlClIent;

seguIr vamos IncluIr o codIgo para


fazer a conexo com o banco de
dados Cadastro no $" , acessar
a tabela CIIentes e exIbIr os seus
dados no 0ataCrId;

5ubIIc class |aInForm : System.WIndows.Forms.Form
[
5rIvate System.WIndows.Forms.0ataCrId m0ataCrId;
5rIvate |ySqlConnectIon mConn;
5rIvate |ySql0atadapter mdapter;
5rIvate 0ataSet m0ataSet;
5ubIIc aInForm()
[
nItIaIIzeCom5onent();

//defIne o dataset
m0ataSet = new 0ata$et();

//defIne strIng de conexao e crIa a conexao
mConn = new $qIConnectIon(PersIst SecurIty
nfo=False;server=localhost;database=Cadastro;uId=root;
server=localhost;database=Cadastro;uId=root;pwd=xxxx);

tr[
//abre a conexao
mConn.D5en();
]
catch(System.xceptIon e)
[
|essage8ox.$how(e.|essage.To$trIng());
]

//verIfIcva se a conexo esta aberta


If (mConn.State == ConnectIonState.Dpen)
[
//crIa um adapter usando a Instruo SQL para
acessar a tabela ClIentes
mdapter = new $qI0ataAda5ter(SLC% *
F#D| ClIentes, mConn);
//preenche o dataset vIa adapter
mdapter.FIII(m0ataSet, ClIentes);
//atrIbuI a resultado a proprIedade 0ataSource do
0ataCrId
m0ataCrId.0ataSource = m0ataSet;
m0ataCrId.0ata|ember = ClIentes;
]
]
No codIgo acIma eu vou falar um pouco sobre a strIng de conexo
usada. le defInIda dessa forma para o provedor $"
ConnectorlNet (.NET).
mConn = new $qIConnectIon( PersIst $ecurIt nfo=FaIse;
"$erver=IocaIhost;" +
"0ataase=Cadastro;"+
"&Id=root;" +
"Pwd=xxx;");
Um objeto $qIConnectIon representa uma sesso para uma fonte
de dados $". Quando crIamos uma
InstncIa $qIConnectIon todas as proprIedades so defInIdas para
os seus valores InIcIaIs. seguIr temos os valores padro no
construtor:
Propriedades Valor Inicial
ConnectIon$trIng em5t strIng ("")
ConnectIonTImeout 15
0atabase em5t strIng ("")
0ata$ource em5t strIng ("")
$erver'ersIon
em5t strIng ("")

D atrIbuto PersIst $ecurIt nfo para uma strIng de conexo


especIfIca se a fonte de dados pode persIstIr uma Informao segura
como as credencIaIs de autentIcao do usurIo. D valo padro
mantIdo como FaIse.

Se PersIst $ecurIt nfo for defInIdo como FaIse e a conexo foI


aberta , o valor retornado pela strIng de conexo no Ir exIbIr a
chave nem a senha.

Se o valor for defInIdo como True a Informao da conexo


IncluIndo a senha pode ser obtIda pela consulta a conexo ,
permItIndo assIm uma forma de acesso no confIvel as Informaes
do usurIo quando a conexo for persIstIda.

proprIedade $erver(0ata$ource) IndIca o nome ou endereo de


rede da InstncIa do |ySQL com o qual ser feIta a conexo.
|ultIplas InstncIas podem ser defInIdas separadas por E.

proprIedade 0ataase defIne o nome do banco de dados atual a ser


usado apos a conexo ser aberta. la no atualIzada
dInamIcamente, desta forma, se voc alterar o banco de dados
usando uma Instruo SQL poder ocorrer um erro. Para alterar o
banco de dados use o mtodo Change0ataase para refletIr o novo
banco de dados.

proprIedade &Id representa a conta que ser usada para acessar o
|ySQL.

proprIedade Pwd representa a senha da conta que esta sendo usada
para o logIn no |ySQL.

pos encerrar o trabalho com a conexo o
objeto $qIConnectIon no fechado, e , por Isso voc deve fechar
a conexo explIcItamente chamando $qIConnectIon.CIose ou
$qIConnectIon.0Is5ose.

Para fechar a conexo sobrescrevemos o mtodo 0Is5ose conforme
abaIxo:

5rotected overrIde voId 0Is5ose(booI dIsposIng)
[
If (dIsposIng)
[
If (mConn.State == ConnectIonState.Dpen)
[
mConn.CIose();
]
]
base.0Is5ose(dIsposIng);
]

o usar o comando Dpen o $qIConnectIon tenta obter uma


conexo a partIr do pool de conexo , se no exIstIr uma conexo
dIsponivel, ser estabelecIda uma nova conexo com uma InstncIa
do |ySQL.

mConn.D5en();

o executar o projeto Iremos obter o seguInte resultado no controle


0ataCrId;

ste foI apenas uma pequena Introduo ao acesso a dados


com $" e C#. guarde em breve artIgos maIs avanados...

Um bom estudo para voc...

Pegue o projeto completo aquI: MySQLExemplo.zip

You might also like