Páginas

quinta-feira, 6 de maio de 2010

Lazarus - Conectando MySQL com SQLdb ou ZeosLib

Vamos mostrar duas maneiras de acessar MySQL no Lazarus. Uma usando os componentes nativos SQLdb e outra usando ZeosLib. Utilizamos no exemplo a versão 5.1.46 do MySQL. O SQLdb da versão 0.9.28.2 não funciona com essa versão do MySQL. Dessa forma, foi instalado o snapshot Lazarus-0.9.29-25198-fpc-2.4.1-20100505-win32.exe (usamos o Windows XP nos testes). Snapshots são builds noturnos do Lazarus compilados com os últimos códigos fonte, corrigindo alguns erros e provavelmente introduzindo outros.

Crie o banco dados no MySQL. Vamos usar o mesmo banco usado em artigos anteriores. Este é o script de criação das tabelas:

create table cidade (id_cidade int not null primary key, nome varchar(30));

create table cliente (id_cliente int not null primary key, nome varchar(40), endereco varchar(40), id_cidade integer references cidade(id_cidade), telefone varchar(14), tipo char(1));

Usando SQLdb

Selecione a aba SQLdb e coloque no Data Module um TMySQL50Connection. Ele que fará a conexão com o banco. Defina então as seguintes propriedades:

DatabaseName - informe o nome do banco de dados que foi criado.
HostName - informe o nome ou o IP do servidor de banco de dados.
Name
- informe um nome para a conexão. Por exemplo: dbCliente.
Password - informe a senha do usuário. Se usar root como nome de usuário, informe a senha definida no momento da instalação do MySQL.

UserName - informe o nome do usuário. Pode ser o root.

Coloque agora um TSQLTransaction e selecione dbCliente na propriedade Database, e na propriedade Name digite trCliente, por exemplo.
Volte ao TMySQL50Connection e informe trCliente na propriedade Transaction. Coloque a propriedade Connected em True para verificar se a conexão é feita. Se retornar uma mensagem de falta da dll libmySQL, localize a mesma no diretório bin do MySQL e copie-a para o diretório system32. Depois volte a propriedade para False.
Coloque um TSQLQuery no Data Module e defina suas propriedades:

Database - selecione dbCliente.
Name - defina queCidade.
SQL - informe SELECT * FROM CIDADE.
Transaction - selecione trCliente.

Coloque agora um TDataSource da aba Data Access e mude Name para dsCidade e em DataSet selecione queCidade.
No evento AfterPost de queCidade digite o código:

queCidade.ApplyUpdates;
trCliente.CommitRetaining;

No evento AfterDelete selecione o mesmo método para não repetir código.
Pronto. Está feita a configuração de acesso, tanto para leitura quanto para escrita, em uma tabela do MySQL. Crie uma interface seguindo os passos descritos no post Lazarus - Acessando banco de dados com SQLdb - Parte I.
Selecione o form principal e, no editor de código, digite abaixo de Implementation:

uses u_dmdados;

Localize o evento OnShow na aba Eventos do Inspetor de objetos.  Dê um duplo clique à direita e digite:

dmDados.dbCliente.Open;

Assim, sempre que o programa for iniciado a conexão com o banco de dados será aberta.

Usando ZeosLib

Usaremos a versão 7.0 do ZeosLib disponível no grupo Lazarus-BR. Para instalar o pacote siga as instruções apresentadas no post Lazarus - Conectando PostgreSQL com ZeosLib. Coloque um TZConnection no Data Module. Defina as propriedades:

AutoCommit - deixe em True para que as transações no banco sejam comitadas automaticamente.
Database - informe o nome do banco de dados criado anteriormente.
HostName - informe o nome ou IP do servidor do banco. Para máquina local informe localhost.
Name - digite dbCliente.
Password - informe a senha do usuário. Em geral a senha do usuário root.

Protocol - informe mysql-5. Observe a versão do MySQL que você está usando.
User - informe o nome do usuário. Geralmente é root.

TransactionIsolation - define o nível de isolamento da transação. No nosso caso vamos usar tiReadCommitted.
Mude Connected para True. No Windows deve ocorrer um erro de ausência de dll. Faça o download aqui e copie-a para system32 do Windows. Depois de conectar com sucesso volte Connected para False.

Coloque um TZQuery e um TZUpdateSQL e configure-os como foi feito no artigo Lazarus - Conectando PostegreSQL com ZeosLib.
No TZUpdateSQL defina essas propriedades assim:

DeleteSQL - DELETE FROM CIDADE WHERE ID_CIDADE = :OLD_ID_CIDADE;
InsertSQL - INSERT INTO CIDADE VALUES (:ID_CIDADE, :NOME);
ModifySQL - UPDATE CIDADE SET NOME = :NOME WHERE ID_CIDADE = :OLD_ID_CIDADE;


Coloque um TDataSource da aba Data Access e defina Name como dsCidade e em DataSet selecione a TZQuery anterior. Ai está. Agora crie a interface com nos posts anteriores.

Atualizado em 04/06/2010.

13 comentários:

Silvia disse...

Bom dia,


como vc comentou no post.. A dll realmente não é compatível. Fiz uma aplicação aqui e tentei rodar no windows mobile 5.0 e ele dá uma mensagem de erro dizendo q a dll não foi encoontrada. Sabe como resolver esse problema??? Existe alguma dll pro mobile??

Agradeço imensamente e, se puder, me responda via e-mail mara.moura@gmail.com.

Att, Silvia

Anônimo disse...

Estou com problema na exibição de campo tipo float, por exemplo: no banco ta gravado 1,15 e 2,1 so que quando vou exibir ele vem no DBEdit assim 115 e 21.
Já tentei configurações internacionais, decimalseparator:=','
Properties EditMask embaralha tudo.
Alguem ja passou por situação semelhante? Sabe como posso resolver este problema?
Minha configuração:
Lazarus version #:0.9.28.2 FPC Version:2.2.4 SVN Revision 22279
MySQL 5.0
ZeosLib 666
Meu e-mail:fbertoldo@dba.com.br
Att.
Fernando Bertoldo

Professor Carlos disse...

Fernando

Enviei resposta para o seu e-mail

Alexandre Krepe Iung disse...

Boa noite, também estou com o mesmo problema do Fernando, se puder me enviar a resposta te agradeço.

Alexandre Krepe
alexandrekrepe@gmail.com

Professor Carlos disse...

Mandei pro seu e-mail a mesma sugestão que fiz ao Fernando. Na verdade eu não sei como ele resolveu, pois não tive retorno

Maiko Trindade disse...

Oi Professor Carlos tudo bm?
estou utilizando a versao 0.9.29 x86, meu SO eh o windows 7 x64 e utilizo o mysql 5.1.

Segui todos so seus procedimentos com a conexao utilizando o componente SQLdb porem sugiu o seguinte erro: Error: Project raised exception class 'External:SIGSEGV'.
Nao entendi pq daria este erro de memoria neste codigo. Agradeco a atencao.

Professor Carlos disse...

Maiko

Isso acontece quando você tenta usar um objeto que não existe mais. Existe a referência, mas não o objeto. Se você preferir mande um demo reproduzindo o erro. Posso tentar ajudar se tiver os fontes.

Oda disse...

Olá Prof. Carlos, tudo bem?

Estou com dificuldades em conectar via Zeos, utilizando Lazarus no Mac OS X.

O problema: ao tentar conectar em tempo de projeto, exibe já a mensagem:
None of the dynamic libraries can be found: libmysqlclient.so.15, libmysqlclient.so

Não sei se já teve experiência em sistema operacional OS x para poder tentar ajudar.

Qualquer ajuda é bem vinda.

Obrigado.

Professor Carlos disse...

Oi
Não tenho experiência com OS x, mas sei que o Zeos precisa dessas libs pra acessar o banco de dados. Como você tem que instalá-las eu não sei :).

Guilherme Magno disse...

Ajuda me . EU fiz tudo que vc ensinou, baixei as dll, em outro lugar, devido ao fato que o link seu estava quebrado. coloquei as, nas pastas system 32, system e WOW sys 64, mais nao consigo, da o erro da falta das lib!

Professor Carlos disse...

Guilherme

Teriamos que saber se as novas versões do MySQL são compatíveis com os componentes SQLdb ou Zeos (qual você está usando?). Isso eu realmente não tenho certeza. Mas o procedimento é esse, copiar as dlls necessárias para a pasta da aplicação ou do system, seja 32 ou 64 bits.

marco aurelio disse...

Ola professor estou com o problema da dll ja coloquei no diretorio porem continua o erro o meu SO e win 7
Obrigado e Parabens pelo blog

Professor Carlos disse...

Marco Aurélio, leia o comentário que fiz para o Guilherme logo acima.

 
Creative Commons License
This work by Carlos Alberto P. Araújo is licensed under a Creative Commons Atribuição-Uso não-comercial-Compartilhamento pela mesma licença 3.0 Brasil License.