Escolar Documentos
Profissional Documentos
Cultura Documentos
https://wiki.freepascal.org/Lazarus_Database_Tutorial/pt
Contents
[hide]
1Introdução
2Lazarus e MySQL
o 2.1Comece a trabalhar com MySQL no Linux ou Windows
o 2.2Comece a trabalhar com FPC no modo texto
o 2.3Conectando ao MySQL uma Aplicação Lazarus
2.3.1Download do Código-Fonte do MYSQL
3Lazarus e PostgreSQL
4Lazarus and SQLite
o 4.1Introduction
o 4.2Requirementos
o 4.3How To Use (Basic Usage)
o 4.4Remarks
5Lazarus and MSSQL
6Lazarus e Interbase / Firebird
o 6.1FBLib Firebird Library
7Lazarus and dBase
8Related Links
9Contributors and Changes
Introdução
Este tutorial mostra como usar o Lazarus com uma variedade de Bancos de dados.
O Lazarus suporta uma diversidade de banco de dados fora-da-caixa, entretanto os
desenvolvedores instalam os pacotes adequados para cada um. Você pode acessar o banco de
dados por código ou jogando componentes no formulário. Os componentes do tipo data-aware (que
precisam de uma fonte de dados para funcionar) representam campos e são conectados ajustando
a propriedade DataSource para apontar para o TDataSource. O Datasource representa a tabela e é
conectado ao componente do banco de dados (exemplos: TPSQLDatabase, TSQLiteDataSet)
ajustando a propriedade DataSet. Os componentes data-aware ficam localizados na aba "Data
Controls". Os controles Datasource e o Database estão localizados na aba "Data Access".
Lazarus e MySQL
Comece a trabalhar com MySQL no Linux ou Windows
Siga as instruções no Manual do usuário MySQL. Certifique-se que o mysqld daemon está rodando
satisfatoriamente, e que todos os potencias usuários(incluindo root, mysql,você mesmo e qualquer
outro que possa necessitá-lo) tenham os privilégios a eles necessários, para os possíveis hosts que
possam necessitá-lo(incluindo 'localhost', o hostname local, e outros hosts na sua rede) para manter
consistência e segurança. É preferivel que todos os usuários incluindo o root tenham passwords.
Teste as ações do sistema de banco de dados usando os exemplos dados no manual do mysql, e
certifique-se que todos os usuários sejam confiáveis no acesso.
sh ./mkdb
Este vai provavelmente falhar, já que o sistema não vai autorizar um usuário anônimo a acessar o
banco de dados. Então mude o script usando um editor de modo que a linha invocando o MySQL
seja:
e tente executá-lo novamente entrando o seu password no prompt. Com sorte você deve ter
conseguido criar o banco de dados de teste: teste-o (enquanto logado no monitor do MySQL)
issuing o estamento do MySQL.
Você deve ver uma tabela listando o ID, nome de usuário e e-mail de alguns dos desenvolvedore do
FPC.
Agora tente executar o program de teste testdb.pp (ele pode precisar ser compilado e vai quase
certamente falhar na primeira tentativa!!).
Eu obtive que o programa não poderia se conectar ao mysql por várias razões:
Meu sistema (SuSE Linux v9.0) instal o mysql v4.0.15, não a versão 3 para a qual o pacote
foi desenhado.
O programa precisa ter nomes de usuários e passwords para ter acesso ao banco de
dados.
O compilador precisa saber onde encontrar as bibliotecas mysql (se você não instalou as
bibliotecas de desenvolvimento MySQL, faça-o agora).
Eu criei uma cópia de testdb.pp chamada trydb.pp em vez de editar o original - isso quer dizer que
os arquivos originais ainda são reparados em subseqüentes atualizações do CVS. Também copiei
os arquivos do subdiretório mysql/ver40/ para o subdiretório principal mysql/, renomeando-os para
mysql_v4.pp, mysql_com_v4.pp and mysql_version_v4.pp, certificando-me de nomear cada unidade
dentro de cada arquivo correspondente. Modifiquei o estamento uses em trydb.pp para uses
mysql_v4 e o estamento em mysql_v4 para
uses mysql_com_v4
O passo seguinte pode não ser necessário se as devel-libraries estiverem instaladas como os links
que serão criados para você, mas não custa verificar. Eu tive que achar o nome real da biblioteca
mysqlclint no diretório /usr/lib e no meu caso tive que entrar o comando:
ln -s libmysqlclient.so.12.0.0 lmysqlclient
para fazer um link simbólico permitindo o FPC achar a biblioteca. Eu também criei o link
ln -s libmysqlclient.so.12.0.0 mysqlclient
e pus links similares em vários outros subdiretórios. Alguns usuários podem precisar adicionar o
seguinte link:
ln -s libmysqlclient.so.12.0.0 libmysqlclient.so
Eu modifiquei o trydb.pp para incluir detalhes de usuários, inicialmente adicionando host, usuário e
password como constantes:
const
host : Pchar= 'localhost';
user : Pchar= 'myusername';
passwd: Pchar = 'mypassword';
Também achei que não poderia conectar ao mysql usando a chamada mysql_connect(), mas tive
que usar mysql_real_connect() que tem muitos mais parâmetros. Para complicar, o número de
parâmetros parece ter mudado entre a versão 3 (quando eram sete) e a versão 4 (em que há oito).
Antes de usar mysql_real_connect eu tive que usar mysql_init() que não é encontrada no mysql.pp
original mas o é no mysql_v4.pp.
Assim o código para a conexão ao banco de dados agora é:
begin
if paramcount=1 then
begin
Dummy:=Paramstr(1)+#0;
DataBase:=@Dummy[1];
end;
fpc trydb
./trydb
begin
dummy1 := trymysqlForm1.HostEdit.text+#0;
host := @dummy1[1];
dummy2 := trymysqlForm1.UserEdit.text+#0;
user := @dummy2[1] ;
dummy3 := trymysqlForm1.PasswdEdit.text+#0;
passwd := @dummy3[1] ;
alloc := mysql_init(PMYSQL(@qmysql));
sock := mysql_real_connect(alloc, host, user, passwd, database, 0,
nil, 0);
if sock=Nil then
begin
strg :='Couldnt connect to MySQL.'; showstring (strg);
Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring
(strg);
end
else
begin
trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';
strg := 'Now choosing database : ' + database; showstring (strg);
{$ifdef Unix}
strg :='Mysql_port : '+ IntToStr(mysql_port); showstring
(strg);
strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring
(strg);
{$endif}
Strg :='Host info : ' + StrPas(mysql_get_host_info(sock));
showstring (strg);
Strg :='Server info : ' + StrPas(mysql_stat(sock));
showstring (strg);
Strg :='Client info : ' + Strpas(mysql_get_client_info);
showstring (strg);
A caixa de texto à direita permite inserção de um estamento SQL, sem um ponto e vírgula no final.
Quando você estiver satisfeito com o seu conteúdo ou sintaxe, o botão SendQuery é pressionado e
a query é processada, com os resultados sendo escritos no ResultsMemo.
O event handler SendQuery é baseado na versão modo texto do FPC, exceto que conversões
explícitas de tipo têm que ser feitas antes de a string ser mostrada.
Uma diferença do modo texto do programa FPC é que se uma condição de erro for detectada, o
programa não pára e a MySQL não é fechada. Em vez disso, o controle retorna ao formulário
principal e é dada uma oportunidade de corrigir a inserção antes que o comando seja enviado. A
aplicação finalmente fecha (com o fechamento da MySQL) quanto o botão Exit é clicado.
O código para SendQuery é o seguinte:
No PQConnection preencher:
"transaction property" com o respectivo objeto SQLTransaction
Database name
HostName
UserName + password
No SQLQuery preencher:
"transaction property" com o respectivo objeto
"database property" com o respectivo objeto
SQL (algo como 'select * from nometabela')
try
sql:= 'UPDATE table SET setting=1';
PQDataBase.Connected:=True;
PQDataBase.ExecuteDirect('Begin Work;');
PQDataBase.ExecuteDirect(sql);
PQDataBase.ExecuteDirect('Commit Work;');
PQDataBase.Connected:=False;
except
on E : EDatabaseError do
MemoLog.Append('DB
ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
on E : Exception do
MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10
)+E.Message);
end;
Notas:
Testado no windows, Lazarus 0.9.12 + PgSQL 8.3.1
Alguns testes em linux, Lazarus 0.9.12 and PgSQL 8.0.x
Instalação e erros:
Na versão testada do Lazarus .12, campos do tipo "text" e "numeric" tem bugs
Usei sem problemas "char fixed size", "int" e "float8"
Às vezes reiniciar o Lazarus resolve erros estúpidos...
Depois de alguns erros, as transações permanecem ativas e devem ser
desativadas manualmente
As alterações feitas no Lazarus são, naturalmente, não visível até a transação ser
confirmada
The integrated debugger seems buggy (at least in windows) - sometimes running
outside of the IDE may help to find errors
(O depurador integrado parece infestado (pelo menos no windows) - às vezes
executando fora da IDE pode ajudar a encontrar erros)
No linux determinadas mensagens de erro são impressas na console -- executar
seu programa na linha de comando, às vezes há algumas informações úteis de depuração,
extra
Erro: "Can not load Postgresql client. Is it installed (libpq.so) ?"
Adicione o caminho para pesquisa libpq* da instalação PostgreSQL.
No linux adicione o caminho para o arquivo libpq.so para a seção
"libraries" em seu /etc/fpc.cfg file. Por exemplo: -Fl/usr/local/pgsql/lib
No windows, adicione essas "libs" em qualquer lugar na variável de
ambiente Path ou diretório de project
Em windows, copiei todas as DLLs do diretório C:\Program
Files\PostgreSQL\8.1\bin para outro diretório no PATH
Ou adicionar este diretório postgres \bin para o caminho
Lazarus and SQLite
by Luiz Américo Translated by Edson Leonel de oliveira
Introduction
TSqliteDataset e TSqlite3Dataset são comandos TDataset que acessam, respectivamente, bases de
dados sqlite versões 2.8.x e 3.2.x. Abaixo está uma lista das principais vantagens e desvantagens:
Vantagens:
Flexível: programadores podem escolher usar ou não a linguagem SQL, acessando tabelas
com layouts simples ou qualquer layout complexo disponível no SQL/sqlite
Atualização automática da base de dados: não precisa comandar manualmente a
atualização com comandos SQL, um método simples a executa
Rápido: faz um cache dos dados na memória, navegando rapidamente nos dados
Sem configuração e instalação de servidor: conecta-se usando a biblioteca dinâmica sqlite
Disvantagens
Integer
AutoInc
String
Memo
Bool
Float
Word
DateTime
Date
Time
LargeInt
Currency
PS1: If both conditions are set, the field corresponding to PrimaryKey is used to apply the updates.
PS2: Setting PrimaryKey to a field that is not a Primary Key will lead to loss of data if ApplyUpdates
is called, so ensure that the chosen field contains not Null and Unique values before using it.
Remarks
Although it has been tested with 10000 records and worked fine, TSqliteDataset keeps all
the data in memory, so remenber to retrieve only the necessary data (principally with Memo
Fields).
The same datafile (Filename property) can host several tables/datasets
Several datasets (different combinations of fields) can be created using the same table
simultaneously
It's possible to filter the data using WHERE statements in the sql, closing and reopening the
dataset (or calling RefetchData method). But in this case, the order and number of fields must
remain the same
It's also possible to use complex SQL statements using aliases, joins, views in multiple
tables (remember that they must reside in the same datafile), but in this case ApplyUpdates
won't work. If someone wants to use complex queries and to apply the updates to the datafile,
mail me and I will give some hints how to do that
Setting filename to a sqlite2.x datafile not created by TSqliteDataset and opening it is
allowed but some fields won't have the correct field type detected. These will be treated as string
fields.
Generic examples can be found at fpc/fcl/db/sqlite CVS directory
Luiz Américo pascalive(at)bol(dot)com(dot)br
Dbf1.FilePathFull := '/path/to/my/database';
Dbf1.TableName := 'dvds';
With Dbf1.FieldDefs do begin
Add('Name', ftString, 80, True);
Add('Description', ftMemo, 0, False);
Add('Rating', ftString, 5, False);
end;
Dbf1.CreateTable;
When this code is run, your DVD collection table will be created. After that, all data aware
components linked through the TDatasource to this component will allow easy access to the data.
Adding indexes is a little different from your typical TTable. It must be done after the database is
open. It's also the same method you use to rebuild the indexes. For instance:
Dbf1.Exclusive := True;
Dbf1.Open;
Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique,
ixCaseInsensitive]);
Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);
Dbf1.Close;
The first (primary) index will be a file called "dvdsname.mdx" and the second will be a file named
"rating.ndx" so in a multiple table database you must be careful not to use the same file name again.
I will try to add a more detailed example at a later date, but hopefully this will get those old Delphi
programmers up and running with databases in Lazarus!
Related Links
Creating Databases Applications with Lazarus using the DB-unit
Creating a database application using MySQL
Creating a database application using the Zeos components
Pascal Data Objects is a database API that worked for both FPC and Delphi and utilises
native MySQL libraries for version 4.1 and 5.0. It's inspired by PHP's PDO class.
https://trac.synsport.com:8000/index.php/pdo/wiki (username/password is guest/guest)