Você está na página 1de 19

Universidade Federal de Santa Maria

Colégio Politécnico
Curso Técnico em Informática

Delphi e MySQL

Santa Maria, 2o. Semestre 2008


1. Introdução

 O Delphi proporciona uma interface comum para tratar vários banco de dados a
partir dos componentes Borland® dbExpress.

 Esses componentes foram desenvolvidos com os seguintes 6 objetivos em mente:


1 Minimizar o tamanho e uso de recursos do sistema.
2 Maximizar a velocidade.
3 Facilitar o desenvolvimento.
4 Prover uma plataforma comum a vários banco de dados
5 Proporcionar uma forma simples de implementação de drivers.
6 Dar ao desenvolvedor um maior controle sobre o uso de memória e tráfico da rede.
1. Introdução

 A arquitetura uma total manimpulação de dados utiliza quatro componentes:


 SQLConnection propicia uma conexão com o dbExpress driver para o
banco de dados em uso.
 dbExpress dataset propicia dados a partir da execução de um comando
SQL SELECT ou invocando um procedimento
armazenado. Existem quatro componentes datset:
SQLDataset, SQLQuery, SQLStoredProc e SQLTable.
 DataSetProvider interpreta as consultas ou procedimentos armazenados,
recupera os dados, fecha as consultas ou procedimentos
armazenados e fornece os dados para o ClientDataSet.
 ClientDataSet solicita dados do DataSetProvider e os retem na memória
enquanto são visualizados e modificados pelo usuário.
2. Implementando com dbExpress

 A aplicação exemplo utiliza o banco de dados MySQL EMPREGADOS que


apresenta um relacionamento 1-N entre as tabelas empregado e HistoricoSalario.

 Siga os passos seguintes:


1 Crie uma nova aplicação e adicione um data module. Dê o nome dmPrincipal
para o data module.
2 Use as opções do projeto para assegurar que o data module é criado
automaticamente antes do formulário principal.

3 Adicione um componente SQLConnection da aba dbExpress no data module.


4 Dê o nome sqlcEmpregadosConexao para o componente SQLConnection e
defina o nome do driver para OpenMySQL50.
5 Clique duas vezes sobre o componente para abrir o editor de parâmetros e
defina o caminho para o banco de dados exemplo, bem como o nome do usuário
e a senha.
2. Implementando com dbExpress

6 Defina a propriedade LoginPrompt como FALSO

7 Teste a conexão.
Clique neste ícone para testar a conexão

Um aviso de conexão com


sucesso deve aparecer
2. Implementando com dbExpress

8 Adicione um componente SQLQuery no data module


Observação: O componente SQLQuery retorna uma consulta somente-leitura unidirecional, por causa deste fato edição de
dados não esta disponível.

9 Defina a propriedade SQLConnection como sqlcEmpregadosConexao.

10 Nomeie o componente como qryEmpegado.

11 Defina a propriedade SQL do qryEmpregado como:

SELECT * FROM EMPREGADO ORDER BY NOME


2. Implementando com dbExpress

12 Dê um duplo clique em qryEmpregado e abra o editor de campos e adicione todos


os campos.
13 Selecione o campo idEmp, expanda o propriedade ProviderFlags, e defina
pfInKey como TRUE. Esta flag identifica campo idEmp como a chave primária. O
DataSetProvider (que será adicionado na seqüência) necessita desta informação para
construir os comandos SQL e aplicar as modificações no banco de dados.
14 Defina a propriedade Active com TRUE para o componente qryEmpregado.
15 Adicione um DataSetProvider a partir da aba Data Access do componente palette.

16 Defina a propriedade Name como prvEmpregado e DataSet como qryEmpregado.

17 Adicione um ClientDataSet no data module e defina as propriedades


ProviderName como prvEmpregado e Name como cdsEmpregado.

18 Adicione um DataSource no data module, defina o nome como dsEmpregadoLink


e a propriedade DataSet como cdsEmpregado.
2. Implementando com dbExpress

19 Dê um clique duplo para abrir o editor de campos do cdsEmpregado e adicione


todos os campos (ctrl+F).
20 Clique com o botão direito sobre cdsEmpregado e escolha a opção Fetch Params
de modo a permitir que os parâmetros do ClientDataSet combinem com os
parâmetros do qryEmpregado.
21 Defina a propriedade Active como TRUE. Neste ponto o data module de ter a
aparência apresentada na figura abaixo.
2. Implementando com dbExpress

22 Adicione um DBGrid ao formulário principal, conforme ilustrado na figura abaixo.


2. Implementando com dbExpress

23 Adicione o data module ao formulário principal ( FILE | Use Unit ... )


24 Defina a propriedade Datasource do DBGrid como dsEmpregado.
25 Adicione ao formulário dois componentes: um TButton e um TDBNavigator.
26 Defina a propriedade DataSource do DBNavigator como dsEmpLink e associe o
código abaixo ao evento onClick do Button.
uDmPrincipal.DmPrincipal.cdsEmpregado.ApplyUpdates(-1);
2. Implementando com dbExpress

O próximo exemplo considera uma implementação semelhante à anterior, mas sem o


componente TdataSetProvider.
1 Siga os passos 1-7 do exemplo anterior.
2 Adicione ao data module dois componentes: SQLDataSet e SQLQuery. Aponte as
propriedades SQLConnection destes components para sqlcEmpregadosConexao. O
SQLDataSet é utiliado para realizar as inclusões, alterações e exclusões e o
SQLQuery para realizar as consultas.
Antes de seguir, é oportuno estudar um pouco sobre o uso transações em banco de
dados.
2. Implementando com dbExpress

Transações são métodos adotados nos banco de dados Cliente/Servidor para garantir a integridade
dos dados alterados no banco.

Suponha que seja necessário corrigir uma folha de pagamento de uma empresa, na qual os
registros precisam passar por muitas validações e devem ser confirmados ou abandonados todos
de uma vez, fazendo sucessivas alterações em duas ou mais tabelas. E se no meio do processo
ocorre algum erro? Algumas tabelas terão seus dados gravados, e outras não, tornando os resultdos
da operação não confiáveis, com informações incorretas. É neste ponto que entram as transações.

Quando se inicia uma transação no banco, o servidor faz cache em memória de todos os registro
das tabelas que estão sendo atualizados/apagados. Os dados só são permanentemente gravados no
banco, quando a transação se completa com sucesso (como comando Commit). Caso algum erro
venha a ocorrer no meio da transação, todos os dados são abandonados, retornando as tbelas ao
modo como estavam ants, sem perda de dados, corrupção ou erros nas tabelas.

Os recursos de transação não existe em bancos Desktop, apenas em bancos Cliente/Servidor, e tem
a função principal de manter a integridade e segurança dos dados, principalmente onde existem
muitos clientes acessando as mesmas informações ao mesmo tempo.
2. Implementando com dbExpress

No exemplo corrente, utiliza-se o conceito de transação não apenas para incluir, alterar ou excluir
dados da tabela, mas também para realizar as consultas. Quando uma transação é aberta para
realizar uma consulta, de modo que sempre seja possível ter certeza que os dados retornados são
os mais atuais, independente se outros clientes estão alterando ou excluindo o registro pesquisado.

Para finalizar uma transação gravando os dados no banco é utilizado o comando Commit, e para
desfazer as alterações, sem gravar as informações, é utilizado o comando Rollback.

Para utilizar corretamente as transações neste exemplo é necessário declarar uma variável, no
inicio da unit:

Var

Form1 : Tform1;

Transacao : TtransactionDesc;

Implementation

(...)
2. Implementando com dbExpress

A TtransactionDesc é uma estrutura (record) que define a transação. Um ponteiro dessa estrutura é
passado cada vez que se inicia, finaliza ou se cancela uma transação. Esta estrutura está definida
na biblioteca DBXpress.

3 Construa um formulário conforme apresentado na figura abaixo.


2. Implementando com dbExpress

Propriedades do ListView:

RowSelect = True

ViewStyle = vsReport

Clique duas vezes no Listview e inclua uma coluna com as seguinte propriedades:

Caption = Nome

Width = largura do componente ListView


2. Implementando com dbExpress
4 Dê um duplo clique no botão Procurar, e no editor de códigos digite:
p ro ce d u re TFo rm 1 .b t Pro cu ra rClick(Se n d e r: TOb je c t );
v a r co n s u lt a : s t rin g ;
b e g in
if t rim (e d t Pro cu ra .t e xt ) < > '' t h e n
b e g in
c o n s u lt a := 'SELECT n o m e from e m p re g a d o wh e re n om e like ';
if rb Co n t e n h a .Ch e c ke d t h e n
c o n s u lt a := c on s u lt a + '''% '+ e d t Proc u ra .t e xt + '% '' '
e ls e
c o n s u lt a := c on s u lt a + ''''+ e d t Pro cu ra .t e xt + '% '' ';

t ry
Tra n s a ca o.Tra n s a ct ion ID:= 1 ;
Tra n s a ca o.Is o la t ion Le ve l:= xilREPEATABLEREAD;
d m Prin c ip a l.Da t a Mod u le 1 .Em p lo ye e Co n n e ct ion .St a rt Tra n s a ct ion (t ra n s a c a o );
d m Prin c ip a l.Da t a Mod u le 1 .SQLQu e ry1 .clo s e ;
d m Prin c ip a l.Da t a Mod u le 1 .SQLQu e ry1 .SQL.cle a r;
d m Prin c ip a l.Da t a Mod u le 1 .SQLQu e ry1 .SQL.Ap p e n d (c on s u lt a );
d m Prin c ip a l.Da t a Mod u le 1 .SQLQu e ry1 .Op e n ;
d m Prin c ip a l.Da t a Mod u le 1 .Em p lo ye e Co n n e ct ion .Co m m it (t ra n s a c a o );
e x ce p t
o n Exc :Exce p t io n d o
b e g in
Sh o wMe s s a g e ('Oc orre u u m e rro n a co n s u lt a : ' + Exc .Me s s a g e );
d m Prin c ip a l.Da t a Mo d u le 1 .Em p lo ye e Co n n e ct io n .Ro llb a ck(t ra n s a ca o);
e nd;
e nd;
Ca rre g a Lis t a ;
e nd;

e nd;
2. Implementando com dbExpress
5 Acrescente o seguinte método à classe TForm1 no editor de códigos:
p ro c e d u re TFo rm 1 .Ca rre g a Lis t a ;
v ar
list It em : TList It em ;

begin
dm Principal.Dat aModule1.SQLQuery 1.First ;
List View 1.It em s.Clear;

w hile not dm Principal.Dat aModule1.SQLQuery 1.Eof do


begin
list It em := List View 1.It em s.Add;
list It em .Capt ion:= dm Principal.Dat aModule1.SQLQuery1.Fields.Fields[ 0] .AsSt ring;
dm Principal.Dat aModule1.SQLQuery 1.nex t ;
end;

end;
2. Implementando com dbExpress
6 Dê um duplo clique no botão Incluir, e no editor de códigos digite:
procedure TForm 1.bt IncluirClick(Sender: TObject );
begin
t ry

Transacao.Transact ionID:= 1;
Transacao.Isolat ionLevel:= x ilREPEATABLEREAD;
dm Principal.Dat aModule1.Em ploy eeConnect ion.St art Transact ion(t ransacao);
dm Principal.Dat aModule1.SQLDat aSet 1.close;
dm Principal.Dat aModule1.SQLDat aSet 1.Com m andType:= ct Query;
dm Principal.Dat aModule1.SQLDat aSet 1.Com m andText :=
'insert int o em pregado (nom e) values(:nom eEm p)';
dm Principal.Dat aModule1.SQLDat aSet 1.Param By Nam e('nom eEm p').AsSt ring:= edt Nom e.t ex t ;
dm Principal.Dat aModule1.SQLDat aSet 1.ExecSQL;
dm Principal.Dat aModule1.Em ploy eeConnect ion.Com m it (t ransacao);

ex cept

on Exc:Except ion do
begin
Show Message(' Ocorreu um erro na t ent at iva de inclusao do regist o : ' + Ex c.Message);
dm Principal.Dat aModule1.Em ploy eeConnect ion.Rollback(t ransacao);
end;

end;

end;
2. Implementando com dbExpress
7 Experimente terminar a implementação adicionando código para os temais botões.

Você também pode gostar