Páginas

segunda-feira, 22 de março de 2010

Lazarus - Conectando Firebird com SQLdb ou ZeosLib

Vamos mostrar duas maneiras de acessar Firebird no Lazarus. Uma usando os componentes nativos SQLdb e outra usando ZeosLib. Já fizemos aqui alguns exemplos e a construção da interface não será mais tratada. Apresentaremos apenas os passos necessários no Data Module. Usaremos a versão 0.9.29 do Lazarus.
Antes de iniciar é importante ter conhecimento da versão do Firebird, principalmente para o caso de usar ZeosLib. Crie o banco dados. Vamos usar o mesmo banco usado em artigos anteriores.

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

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

Diferente do PG, no Firebird você pode ter um arquivo de banco em qualquer diretório que você queira, desde que seja na máquina local onde está instalado o servidor FB.

Usando SQLdb

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

DatabaseName - informe o arquivo do banco de dados com o caminho completo.
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. Normalmente é masterkey.
UserName - informe o nome do usuário. Normalmente é sysdba.

Coloque agora um TSQLTransaction e selecione dbCliente na propriedade Database, e na propriedade Name digite trGeral, por exemplo.
Volte ao TIBConnection e informe trGeral na propriedade Transaction. Coloque a propriedade Connected em True para verificar se a conexão é feita. Depois volte 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 trGeral.

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;
trGeral.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 FB. Assim como nos exemplos anteriores lembre-se de conectar e desconectar o banco de dados através de código.

Usando ZeosLib

Usaremos a versão 7.0 do ZeosLib disponível no grupo Lazarus-BR. Coloque um TZConnection no Data Module. Defina as propriedades:

Database - informe o arquivo do banco com o caminho completo.
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. Geralmente masterkey.
Protocol - informe firebird-xx. Observe a versão do FB que você está usando.
User - informe sysdba.

Mude Connected para True. No Windows se ocorrer um erro de dll, localize a mesma na pasta do FB 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.
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.

15 comentários:

Anônimo disse...

Primeiro meus parabéns pelo blog.É muito bom!! Mas eu gostaria de saber como resolver o problema do campo auto-incremento ( configurado pela trigger no banco de dados do firebird).

Valdirene

Professor Carlos disse...

Obrigado pelo comentário. Você poder dar detalhes do problema?

Anônimo disse...

Bem, eu tambem rodei o exemplo e está dando um erro relacionado com a trriger. A mensagem é "Project meuprojeto.exe raised exception class 'external: SISSEGV'.
Aparentemente é nesta linha:
procedure TDBEdit.KeyPress(var Key: char);
function CanAcceptKey: boolean;
begin
Result := Field.IsValidChar(Key) and
(Field.DataType<>ftAutoInc);
end;
var
SavedKey: Char;

Professor Carlos disse...

Você criou um trigger para o autoincremento? Qual o seu objetivo com esse código? Pode enviar o código do gatilho?

Anônimo disse...

Sim, eu criei uma trigger de autoincremento no banco de dados Firebird.
Eu quero que o formulário vá aumentando a numeração, ex: 01,02,03...). Mas na hora em que tento gravar dá um erro no lazarus.

Código da trigger:
Insert as
begin
if (new.id_cidades is null) then
new.id_cidades = gen_id(gen_cidades_id,1);
end

Professor Carlos disse...

O erro SIGSEGV acontece quando vc tenta acessar um objeto que não foi criado ou então foi destruido. Se vc puder criar um pequeno demo reproduzindo o problema, mande para o meu e-mail que vou verificar.

Fabio Ferreira disse...

Hi, I write in English because I don't know portuguese.
I have a blog with a clear tutorial to make an application with Lazarus+Zeos+Sqlite.

The link is this:

http://lazaruszeos.blogspot.com/

I hope it will be usefull

Willian Tessaro disse...

e essa ligação daria certo para WIndowsMobile? queria conectar o SQLITE do palm com um banco de dados FIREBIRD do computador. seria possivel via wireless? esse tutorial funcionaira compilando meu projeto para WinCE?

Professor Carlos disse...

Da maneira que está feito não funciona no WM. Precisaria ter um SGBD Firebird no PDA, que não existe. A solução é criar um servidor de aplicação no desktop acessando o FB. Dai o PDA envia as requisições necessárias ao appserver, que executa e devolve o resultado. Dá pra fazer isso usando o componente lNet, que é compatível com o WM.

Anônimo disse...

Ola tudo bom?
Começei montar um programa com lazarus e usei o ibexplex, fiz a conecção igual seu tutoail e funcionol, só que tem um problema, eu fiz uma chave estrangeira na tabela imprestimo de livro , liguei id livro ao campo livro emprestado, ai como faço para na hora de cadastrar um emprestimo ele puxar o livro da tabela livro?
tipo no meu serviço é em delphi quando vc vai cadastar um produto por exemplo vc aperta tab no campo e aparece uma lsita com todos produtos, ñ tou conseguindo fazer essa ligação no lazarus.
Tem alguma dica?
t+++

Professor Carlos disse...

Use DBLookUpComboBox. Eu descrevo como fazer isso no post http://professorcarlos.blogspot.com/2010/02/lazarus-acessando-banco-de-dados-com_24.html

Anônimo disse...

Olá professor estou tentando instalar o Zeoslib para usá-lo com o mysql5.5 só que durante a compilação na Unit ZAbstractROdataset aparece a seguinte mensagem de erro:C:\Users\lidiane\programas\src\component\ZAbstractRODataset.pas(3024,47) Error: Illegal expression
e aí o componente não é instalado.
Eu estou usando a versão 0.9.31 do lázarus.
Obrigada
Lidiane

Professor Carlos disse...

Quais as versões do Zeos e Lazarus que você está usando?

Amadeu Fronza disse...

Boa tarde Professor!
Olá tudo bem
Estou usando Lazarus,Zeus, Firibird
No windows Xp esta conectando mas no win 7 não conecta ao banco ja setei varias biblio mas todas diz que tem incompatibilidade o senhor teria alg

Professor Carlos disse...

Se o seu Windows for 64 bits, as dlls devem ficar no SysWOW64

 
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.