Вы находитесь на странице: 1из 5

Delphi Lazarus (linux) : MySQL

Objetivo
Ter o primeiro contato com banco de dados em Lazarus. Aprender a criar
um banco de dados MySQL e a usar a AP de programao para
executar funes simples de acesso e consulta!
"o#ponentes $tiliza%os
&or#' Label' (%it ' )utton e Me#o!
MySQL
ste pro!eto ensina a conectar o Lazarus ao MySQL * e a executar
consultas simples" usando apenas componentes b#sicos do Lazarus.
Desenvolver o Projeto
Pri#eira &ase Linha %e "o#an%o
$. %rie um banco de dados MySQL' a partir de um s&ell unix. 'o
es(uea (ue o mys(l ser)er de)e estar rodando*
/etc/rc.d/init.d/mysqld start (como root)
Agora, acesse o servidor (o root do mysql no o
mesmo root do linux).
mysql +u root +p
mysql> create database testdb;
mysql> use mysql;
mysql> grant all on testdb to z-user
indentified by 'z-ass!ord';
mysql> flush privileges;
mysql> quit
,. -ode o script #+%b' (ue criar# a tabela &P%ev' no banco test%b!
./0bin0s&
.
. Script para criar uma tabela 123de)1 e preenc&4+la com
dados.
. 5 script aceita um argumento opcional *
. A (ue banco de dados se conectar 6default 1testdb17.
ec&o +n 8%riando e populando a tabela 23de) do
banco de dados 9:$+testdb;...8
mys(l +u root 9:$+testdb; +p << 52 =0de)0null
. limina a tabela caso ela !# exista.
D,OP -A)L( & (.S-S 2pde)>
. %ria a tabela.
",(A-( -A)L( 23de) 6
id ?'T '5T '@LL"
@ser'ame %AA-6,BB7"
?nstmail %AA-6,BB7"
3-?MA-C DC 6id7"
?'EF 6id7 7>
insert into 23de) )alues 61$1"1Mic&ael Gan %anneyt1"
1Mic&aelHtfdec$.fys.Iuleu)en.ac.be17>
insert into 23de) )alues 61,1"12lorian Dlaempfl1"
1ba,JKBHfen.baynet.de17>
insert into 23de) )alues 61J1"1%arl+ric %odere1"
1codcL$Hgel.us&erb.ca17>
insert into 23de) )alues 61M1"1Eani Mantione1"
1d.s.p.mantioneHtNi.tudelft.nl17>
insert into 23de) )alues 61B1"13ierre Muller1"
1mullerHeurope.u+strasbg.fr17>
insert into 23de) )alues 61O1"1Ponas Maebe1"
1!maebeHmail.dma.be17>
insert into 23de) )alues 61Q1"13eter Greman1"
1pf)HNorldonline.nl17>
insert into 23de) )alues 61R1"1Serry Eubois1"
1gerryHNebNorIs.ml.org17>
52
. m bas&" o )alor de retorno de um programa T armazenado
. numa )ari#)el c&amada 9U
if V / 9U W L X> t&en
ec&o 82al&ou.8
else
ec&o 82eito.8
fi
. Terminado
J. %ompile o programa abaixo" (ue acessar# o banco*
(/p0 test%b*!pp)
program (test>
uses
mys(lM>
const
EataYase * 3c&ar W 1testdb1>
Query * 3c&ar W 1Select Z from 23de)1>
&ost * 3c&ar W 1local&ost1>
user * 3c&ar W 1zT+user1>
passNd * 3c&ar W 1zT+passNord1>
)ar
count" num * longint>
code * integer>
socI * 3MCSQL>
(mys(l * TMCSQL>
(buf * string V$OLX>
roNbuf * TMCSQL[-5\>
dummy * string>
recbuf * 3MCSQL[-S>
alloc * 3MCSQL>

begin
if paramcountW$ t&en
begin
Eummy*W3aramstr6$7].L>
EataYase*WHEummyV$X>
end>

\riteln 61Alocando spao ...17>
alloc *W #ys1l2init 63MCSQL6H(mys(l77>
\rite 61%onectando ao MySQL ...17>
socI *W #ys1l2real20onne0t 6alloc" &ost" user" passNd"
EataYase" L" nil" L7>
if socIW'il t&en
begin
\riteln 6stderr"1'o foi poss^)el conectar ao MySQL.');
\riteln 6stderr" 15 erro foi* 1" mys(l[error6H(mys(l77>
&alt6$7>
end>
\riteln 61Eone.17>
\riteln 61%onnection data*17>
:9ifdef @nix;
Nriteln 61Mys(l[port * 1"mys(l[port7>
Nriteln 61Mys(l[unix[port * 1"mys(l[unix[port7>
:9endif;
Nriteln 61Aost info * 1"mys(l[get[&ost[info6socI77>
Nriteln 61Ser)er info * 1"mys(l[stat6socI77>
Nriteln 61%lient info * 1"mys(l[get[client[info7>

\riteln 61Selecionando o Yanco1"EataYase"1...17>
if #ys1l2sele0t2%b 6socI"EataYase7 < L t&en
begin
\riteln 6stderr"1'o foi poss^)el selecionar o Yanco1"
Database);
\riteln 6stderr"#ys1l2error 6socI77>
&alt 6$7>
end>
\riteln 61xecutando consulta* 1"Query"1...17>
if 6#ys1l21uery 6socI"Query7 < L7 t&en
begin
\riteln 6stderr"1Query failed 17>
"#gina $ de %
Delphi Lazarus (linux) : MySQL
Nriteln 6stderr"#ys1l2error 6socI77>
Aalt6$7>
end>
recbuf *W #ys1l2store2result 6socI7>
if -ecYufW'il t&en
begin
\riteln 61%onsulta retornou resultado nulo.17>
#ys1l20lose 6socI7>
&alt 6$7>
end>
\riteln 61'_mero de registros retornados*
1"#ys1l2nu#2ro3s 6recbuf77>
\riteln 61'_mero de campos por registro*
1"#ys1l2nu#2/iel%s 6recbuf77>
roNbuf *W #ys1l2/et0h2ro3 6recbuf7>
N&ile 6roNbuf <=nil7 do
begin
\rite 616?d* 1" roNbufVLX7>
\rite 61" 'ame* 1" roNbufV$X7>
\riteln61" mail * 1" roNbufV,X"1717>
roNbuf *W #ys1l2/et0h2ro3 6recbuf7>
end>
\riteln
61Liberando a mem`ria alocada pelo con!unto resultado ...17>
#ys1l2/ree2result 6recbuf7>
\riteln 612ec&ando a conexo com o MySQL.17>
#ys1l20lose 6socI7>
&alt6L7>
end.
M. -ode o programa" (ue de)e listar os nomes e emails de alguns do
desen)ol)edores do free pascal* test%b*
%onnecting to MySQL...Eone.
%onnection data*
Mys(l[port * JJLO
Mys(l[unix[port * 0)ar0lib0mys(l0mys(l.socI
Aost info * Local&ost )ia @'?F socIet
Ser)er info * @ptime* $JM$BBK T&reads* $ Questions* $,,
SloN (ueries* L 5pens* , 2lus& tables* B 5pen tables* $
Queries per second a)g* L.LLL
%lient info * M.$.$M
Selecting Eatabase testdb...
xecuting (uery * Select Z from 23de)...
'umber of records returned * R
'umber of fields per record * J
6?d* $" 'ame* Mic&ael Gan %anneyt" mail *
Mic&aelHtfdec$.fys.Iuleu)en.ac.be7
6?d* ," 'ame* 2lorian Dlaempfl" mail * ba,JKBHfen.baynet.de7
6?d* J" 'ame* %arl+ric %odere" mail * codcL$Hgel.us&erb.ca7
6?d* M" 'ame* Eaniel Mantione" mail *
d.s.p.mantioneHtNi.tudelft.nl7
6?d* B" 'ame* 3ierre Muller" mail * mullerHeurope.u+strasbg.fr7
6?d* O" 'ame* Ponas Maebe" mail * !maebeHmail.dma.be7
6?d* Q" 'ame* 3eter Greman" mail * pf)HNorldonline.nl7
6?d* R" 'ame* Serry Eubois" mail * gerryHNebNorIs.ml.org7
2reeing memory occupied by result set...
%losing connection Nit& MySQL.
B. Lista das 44 /un56es do MySQL utilizadas 6declaradas em %7*
1) MCSQL Zmys(l[init 6MCSQL Zmys(l7
Aloca ou inicia um ob!eto MCSQL ade(uado a c&amada da
funo mys(l[real[connect67.
,7 MCSQLZ mys(l[real[connect6
MCSQL Zmys(l"
const c&ar Z&ost"
const c&ar Zuser"
const c&ar ZpassNd"
const c&ar Zdb"
unsigned int port"
const c&ar Zunix[socIet"
unsigned long client[flag7
Tenta estabelecer uma conexo com um banco de dados
MySQL rodando em &ost. sta funo de)e ser
completada sem erro antes (ue se possa executar
(ual(uer outra c&amada de funo da A3?. -etorna um
ponteiro 6ZMCSQL7 para o handle da conexo em caso de
sucesso ou '@LL" em caso de fracasso.
J7 int mys(l[(uery(
MCSQL Zmys(l"
const c&ar Z(uery7
xecuta a consulta SQL apontada pela string no nula
query. A consulta de)e consistir de um _nico comando
SQL. 'o de)e ser adicionado um terminador b; ou \g
ao comando.
mysql_query() no pode ser usada para consultas (ue
conten&am dados bin#rios> neste caso" de)e ser usada
mysql_real_query() . 6Eados bin#rios podem conter o
caracter \0" (ue o mysql_query() interpreta como o final
da string de consulta7.
-etorna zero se a consulta foi bem sucedida ou um )alor
diferente de zero" se ocorreu algum erro.
M7 MCSQL[-5\ mys(l[fetc&[roN 6MCSQL[-S Zresult7
-etorna a pr`xima lin&a de um con!unto resultado ou
'@LL" se no &ou)er mais lin&as.
B7 MCSQL[-S Zmys(l[store[result 6MCSQL Zmys(l7
Ee)e+se c&amar mys(l[store[result67 para cada consulta
bem sucedida (ue retorne dados 6Select" S&oN" Eescribe"
xplain7. 5 resultado completo de uma consulta do cliente
T lido" uma estrutura MCSQL[-S T alocada e recebe o
resultado.
O7 )oid mys(l[free[result(
MCSQL[-S Zresult )
Libera a mem`ria alocada pelo con!unto resultado das
funes mysql_store_result(),
mysql_use_result(), mysql_list_dbs()" etc...
Q7 int mys(l[select[db 6
MCSQL Zmys(l"
const c&ar Zdb7

2az com (ue o Yanco de Eados especificado por db se!a o
default 6corrente7 na conexo especificada por mys(l. m
consultas subse(centes" este banco de dados T o default
em todas as refer4ncias a tabelas (ue no incluam um
especificador explicito.
R7 unsigned long mys(l[num[roNs 6
MCSQL[-S Zresult7
-etorna o n_mero de lin&as 6registros7 de um con!unto
resultado
K7 unsigned int mys(l[num[fields 6
MCSQL[-S Zresult7
"#gina & de %
Delphi Lazarus (linux) : MySQL
-etorna o n_mero de colunas 6campos7 de um con!unto
resultado.
$L7 const c&ar Zmys(l[error 6MCSQL Zmys(l7
3ara a conexo especificada por mys(l" retorna uma string
terminada por '@LL" contendo a mensagem de erro para a
funo da A3? in)ocada mais recentemente (ue fal&ou.
$$7 )oid mys(l[close(MCSQL Zmys(l)
2ec&a uma conexo (ue foi aberta pre)iamente" e
desaloca o handle de conexo apontado por mysql, se
este foi alocado automaticamente por mysql_init() ou
mysql_connect().
Se7un%a &ase nter/a0e 8r9/i0a
$. %rie um no)o pro!eto. -enomeie o formul#rio para
TryMCSQL e adicione tr4s (%it)ox*
:ost 6AostLabel e Aostdit7.
$serna#e 6@serLabel e @serdit7.
Pass3or% 63assNdLabel e 3assNddit7.
,. Selecione o Tdit Pass3% e encontre a propriedade
Pass3or%"har! Mude+a para Z" ou algum outro caracter"
para (ue (uando )oc4 digite a sen&a os caracteres no
apaream na tela" e apenas se!a ecoado uma sTrie de Z.
%ertifi(ue+se de (ue a propriedade Text de cada (%it)ox
este!a em branco.
J. %olo(ue um outro (%it)ox e Label no topo do lado direito
do formul#rio. Mude o label para 1nter SQL %ommand1 e
c&ame+o de %ommanddit.
M. %olo(ue tr4s )ot6es no formul#rio* altere a propriedade
Text para 1%onnect to Eatabase1 6%onnectYutton7" 1xit1
6xitYutton7 e 1Send Query1 6QueryYutton7.
B. Adicione um Me#o)ox com Text 1-esults1 6-esultMemo7.
ncontre a propriedade S0roll)ars e selecione
ssAuto)oth" para (ue os scroll bars apaream
automaticamente se o texto ocupar todo o espao. Torne
)erdadeira a propriedade ;or%;rap.
O. Adicione um Status)ar 6a partir do %ommon %ontrols tab7
e mude a propriedade Si#ple-ext para 1TryMySQL1.
Q. Eeclare as seguintes )ari#)eis na seo i#ple#entation*
const
EataYase * 3c&ar W 1testdb1>
)ar
socI * 3MCSQL>
"#gina ' de %
Delphi Lazarus (linux) : MySQL
(mys(l * TMCSQL>
roNbuf * MCSQL[-5\>
recbuf * 3MCSQL[-S>
alloc * 3MCSQL>
As respostas do banco de dados so con)ertidas em strings e exibidas
no Me#o)ox.
pro0e%ure sho3Strin7 (S: strin7)<
00 exibe uma string em um MemoYox
begin
trymys(l2orm$.-esultsMemo.Lines.Add 6S7
end>
5 e)ento do boto de conexo fica ento*
pro0e%ure -try#ys1l&or#4!"onne0t)utton"li0+(Sen%er: -Obje0t)<
00 %onecta ao MySQL usando dados fornecidos nas caixas de
00 entrada de texto do formul#rio principal 6Main 2orm7.
)ar
strg* string>
dummy$" dummy," dummyJ* string>
&ost" user" passNd* 3c&ar>

begin

dummy$ *W trymys(l2orm$.Aostdit.text].L>
&ost *W Hdummy$V$X> 00 endereo do primeiro caracter da string
dummy, *W trymys(l2orm$.@serdit.text].L>
user *W Hdummy,V$X> 00 endereo do primeiro caracter da string
dummyJ *W trymys(l2orm$.3assNddit.text].L>
passNd *W HdummyJV$X> 00 endereo do primeiro caracter da string
00 tenta abrir uma conexao com o MySQL
alloc *W #ys1l2init 63MCSQL6H(mys(l77>
socI *W #ys1l2real20onne0t 6alloc" &ost" user" passNd" database" L"
nil" L7>
if socI W 'il t&en
begin
strg *W 1'ao foi possi)el conectar ao MySQL.';
showstring (strg);
Strg *W 15 erro foi* 1] Str3as 6#ys1l2error 6H(mys(l77>
s&oNstring 6strg7>
end
else
begin
trymys(l2orm$.statusYar$.simpletext *W 1%onectado ao MySQL1>
strg *W 1scol&endo o banco de dados * 1 ] database>
s&oNstring 6strg7>
00 ?mprime dados da conexao* porta" &ost" ser)idor" cliente
:9ifdef @nix;
strg *W 1Mys(l[port * 1 ] ?ntToStr 6#ys1l2port7>
s&oNstring 6strg7>
strg *W 1Mys(l[unix[port * 1 ] Str3as 6#ys1l2unix2port7>
s&oNstring 6strg7>
:9endif;
strg *W 1Aost info * 1 ] Str3as 6#ys1l27et2host2in/o 6socI77>
s&oNstring 6strg7>
Strg *W 1Ser)er info * 1 ] Str3as 6#ys1l2stat 6socI77>
s&oNstring 6strg7>
Strg *W 1 %lient info * 1 ] Strpas 6#ys1l27et20lient2in/o7>
s&oNstring 6strg7>

trymys(l2orm$.statusbar$.simpletext *W
1Selecionando o Yanco de Eados 1 ] EataYase ]1...1>
if #ys1l2sele0t2%b 6socI"EataYase7 < L t&en
begin
strg *W 1'ao foi possi)el selecionar o banco de dados ' +
Database;
showString (strg);
strg *W #ys1l2error 6socI7>
s&oNString 6strg7>
end
end>
end> 00 "onne0t)utton"li0+
5 c`digo do e)ento clicI do SendQuery T*
"#gina ( de %
Delphi Lazarus (linux) : MySQL
pro0e%ure -try#ys1l&or#4!Query)utton"li0+(Sen%er: -Obje0t)<
)ar
dum(uery" strg* string>
(uery* 3c&ar>
begin
dum(uery *W Trymys(l2orm$.%ommanddit.text>
dum(uery *W dum(uery].L>
(uery *W Hdum(ueryV$X>
trymys(l2orm$.statusbar$.simpletext *W
1xecutando (uery * 1 ] dumQuery ]1...1>
strg *W 1xecutando (uery * 1 ] dumQuery>
s&oNstring 6strg7>
if 6#ys1l21uery 6socI"Query7 < L7 t&en
begin
Strg *W 1Query fal&ou 1 ] Str3as6#ys1l2error 6socI77>
s&oNstring 6strg7>
end
else
begin
recbuf *W #ys1l2store2result 6socI7>
if -ecYufW'il t&en
begin
Strg *W 1Query produziu resultado nulo.1>
s&oNstring 6strg7>
end
else
begin
strg *W 1'umero de registros retornados * 1 ]
?ntToStr6#ys1l2nu#2ro3s 6recbuf77>
s&oNstring 6strg7>
Strg *W 1'umero de campos por registro * 1 ]
?ntToStr6#ys1l2nu#2/iel%s 6recbuf77>
s&oNstring 6strg7>
00 carrega um registro no buffer
roNbuf *W #ys1l2/et0h2ro3 6recbuf7>
00 en(uanto &ou)er registros a tratar
N&ile 6roNbuf <=nil7 do
begin
00 imprime o ?E" 'ome e mail
Strg *W 16?d* 1] roNbufVLX]1" 'ame* 1 ] roNbufV$X] 1" mail * 1 ]
roNbufV,X ]171>
s&oNstring 6strg7>
00 pega o proximo registro
roNbuf *W #ys1l2/et0h2ro3 6recbuf7>
end>
end>
end>
end> 00 Query)utton"li0+
pro0e%ure -try#ys1l&or#4!(xit)utton"li0+ (Sen%er: -Obje0t)<
begin
trymys(l2orm$.StatusYar$.simpletext*W
1Liberando a memoria ocupada pelo con!unto resultado ...1>
#ys1l2/ree2result 6recbuf7>
trymys(l2orm$.StatusYar$.simpletext*W
12ec&ando a conexao com o MySQL.1>
#ys1l20lose 6socI7>
close>
end>
(xe0utar o Projeto
$. Salvar e exe0utar o pro!eto.
,. -estar diferentes comandos MySQL.
select Z from 23de)>
insert into 23de) 6id" @ser'ame" ?nstmail7 )alues
68K8" 8dmundo A. Ee Souza e Sil)a8"
8edmundoHland.ufr!.br87>
update 23de) set ?nstmail W
1edmundoHcos.ufr!.br1 N&ere id W 8K8>
delete from 23de) N&ere id W 8K8>
J. (xpli0ar cada lin&a de c`digo do pro!eto acima.
-are/a A0res0entar:
$. 3ermitir a seleo do banco de dados a ser manipulado.
,. 3ermitir a execuo do comando Sho3 tables< 6formatao
ade(uada das strings7.
J. scre)er c`digo para montar as consultas baseadas nos
campos do banco de dados" sem a necessidade do usu#rio
con&ecer a sintaxe dos comandos MySQL 6uma caixa de dados
para cada campo7.
"#gina % de %

Вам также может понравиться