Sign in Join
Wiki copytemporary

Lazarus Database Tutorial/pt: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Introdução
22
33Este tutorial mostra como usar o Lazarus com uma variedade de Bancos de dados.
44
55O 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".
66
77## Lazarus e MySQL
88
99### Comece a trabalhar com MySQL no Linux ou Windows
1010
1111Siga 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.
1212
1313### Comece a trabalhar com FPC no modo texto
1414
1515Este é o diretório com programa de exemplo \$(fpcsrcdir)/packages/base/mysql/. Voce pode encontrar código fonte do FPC (Free Pascal Compiler) no Lazarus: Menu Tools -\> Options -\> Environment -\> Paths tab -\> FPC source directory. Possivelmente o endereço para o mysql seja em /usr/share/fpcsrc/packages/base/mysql (RPM) ou c:\lazarus\fpcsrc\packages\base\mysql\\ (no windows). Este diretório contém também as units mysql.pp, mysql_com.pp e mysql_version.pp. Antes de rodar o script de teste, voce necessita criar o banco de dados chamada testdb: faça isso logando-se no prompt do mysql (o root com todos os privilegios) e dando o seguinte comando:
1616
17-`CREATE DATABASE testdb;`
17+```text
18+CREATE DATABASE testdb;
19+```
1820
1921Certifique-se que todos os usuário tenham privilegios de acesso apropriados:
2022
21-`GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword'; `
23+```text
24+GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword';
25+```
2226
2327Existe um script chamado mkdb que você deve tentar executar:
2428
25-`sh ./mkdb`
29+```text
30+sh ./mkdb
31+```
2632
2733Este 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:
2834
29-`mysql -u root -p  ${1-testdb} << EOF >/dev/null`
35+```text
36+mysql -u root -p ${1-testdb} << EOF >/dev/null
37+```
3038
3139e 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.
3240
33-`select * from FPdev;`
41+```text
42+select * from FPdev;
43+```
3444
3545Você deve ver uma tabela listando o ID, nome de usuário e e-mail de alguns dos desenvolvedore do FPC.
3646
3747Agora tente executar o program de teste testdb.pp (ele pode precisar ser compilado e vai quase certamente falhar na primeira tentativa!!).
3848
3949Eu obtive que o programa não poderia se conectar ao mysql por várias razões:
4050
4151- 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.
4252
4353- O programa precisa ter nomes de usuários e passwords para ter acesso ao banco de dados.
4454
4555- O compilador precisa saber onde encontrar as bibliotecas mysql (se você não instalou as bibliotecas de desenvolvimento MySQL, faça-o agora).
4656
4757Eu 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
4858
49-`uses mysql_com_v4`
59+``` pascal
60+uses mysql_com_v4
61+```
5062
5163Adicionei uma linha em /etc/fpc.cfg para apontar para minhas bibliotecas:
5264
53-`-Fl/lib;/usr/lib`
65+```text
66+-Fl/lib;/usr/lib
67+```
5468
5569O 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:
5670
57-`ln -s libmysqlclient.so.12.0.0 lmysqlclient`
71+```text
72+ln -s libmysqlclient.so.12.0.0 lmysqlclient
73+```
5874
5975para fazer um link simbólico permitindo o FPC achar a biblioteca. Eu também criei o link
6076
61-`ln -s libmysqlclient.so.12.0.0 mysqlclient`
77+```text
78+ln -s libmysqlclient.so.12.0.0 mysqlclient
79+```
6280
6381e pus links similares em vários outros subdiretórios. Alguns usuários podem precisar adicionar o seguinte link:
6482
65-`ln -s libmysqlclient.so.12.0.0 libmysqlclient.so`
83+```text
84+ln -s libmysqlclient.so.12.0.0 libmysqlclient.so
85+```
6686
6787Eu modifiquei o trydb.pp para incluir detalhes de usuários, inicialmente adicionando host, usuário e password como constantes:
6888
69-`const`\
70-`  host : Pchar= 'localhost';`\
71-`  user : Pchar= 'myusername';`\
72-`  passwd: Pchar = 'mypassword';`
89+``` pascal
90+const
91+ host : Pchar= 'localhost';
92+ user : Pchar= 'myusername';
93+ passwd: Pchar = 'mypassword';
94+```
7395
7496També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.
7597
7698Assim o código para a conexão ao banco de dados agora é:
7799
78-`{ umas poucas variáveis extra }`\
79-`var`\
80-`  alloc : PMYSQL;`\
81-` `\
82-`{fragmento do programa principal }`\
83-` `\
84-`begin`\
85-` if paramcount=1 then`\
86-`   begin`\
87-`   Dummy:=Paramstr(1)+#0;`\
88-`   DataBase:=@Dummy[1];`\
89-`   end;`\
90-` `\
91-`Writeln ('Allocating Space...');`\
92-` alloc := mysql_init(PMYSQL(@qmysql));`\
93-` Write ('Connecting to MySQL...');`\
94-` sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);`\
95-` if sock=Nil then`\
96-`   begin`\
97-`   Writeln (stderr,'Couldn''t connect to MySQL.');`\
98-`   Writeln (stderr, 'Error was: ', mysql_error(@qmysql));`\
99-`   halt(1);`\
100-`   end;`\
101-` Writeln ('Done.');`\
102-` Writeln ('Connection data:');`\
103-`{$ifdef Unix}`\
104-` writeln ('Mysql_port      : ',mysql_port);`\
105-` writeln ('Mysql_unix_port : ',mysql_unix_port);`\
106-`{$endif}`\
107-` writeln ('Host info       : ',mysql_get_host_info(sock));`\
108-` writeln ('Server info     : ',mysql_stat(sock));`\
109-` writeln ('Client info     : ',mysql_get_client_info);`\
110-` `\
111-` Writeln ('Selecting Database ',DataBase,'...');`\
112-` if mysql_select_db(sock,DataBase) < 0 then`\
113-`   begin`\
114-`   Writeln (stderr,'Couldn''t select database ',Database);`\
115-`   Writeln (stderr,mysql_error(sock));`\
116-`   halt (1);`\
117-`   end;`\
118-`{... as original contents of testdb.pp}`
100+``` pascal
101+{ umas poucas variáveis extra }
102+var
103+ alloc : PMYSQL;
104+
105+{fragmento do programa principal }
106+
107+begin
108+ if paramcount=1 then
109+ begin
110+ Dummy:=Paramstr(1)+#0;
111+ DataBase:=@Dummy[1];
112+ end;
113+
114+Writeln ('Allocating Space...');
115+ alloc := mysql_init(PMYSQL(@qmysql));
116+ Write ('Connecting to MySQL...');
117+ sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
118+ if sock=Nil then
119+ begin
120+ Writeln (stderr,'Couldn''t connect to MySQL.');
121+ Writeln (stderr, 'Error was: ', mysql_error(@qmysql));
122+ halt(1);
123+ end;
124+ Writeln ('Done.');
125+ Writeln ('Connection data:');
126+{$ifdef Unix}
127+ writeln ('Mysql_port : ',mysql_port);
128+ writeln ('Mysql_unix_port : ',mysql_unix_port);
129+{$endif}
130+ writeln ('Host info : ',mysql_get_host_info(sock));
131+ writeln ('Server info : ',mysql_stat(sock));
132+ writeln ('Client info : ',mysql_get_client_info);
133+
134+ Writeln ('Selecting Database ',DataBase,'...');
135+ if mysql_select_db(sock,DataBase) < 0 then
136+ begin
137+ Writeln (stderr,'Couldn''t select database ',Database);
138+ Writeln (stderr,mysql_error(sock));
139+ halt (1);
140+ end;
141+{... as original contents of testdb.pp}
142+```
119143
120144Agora - pronto para começar a compilar trydb.pp?
121145
122-` fpc trydb`
146+```text
147+ fpc trydb
148+```
123149
124150successo! Agora execute:
125151
126-` ./trydb`
152+```text
153+ ./trydb
154+```
127155
128156Oba! Consegui a lista dos desenvolvedores do FPC!
129157
130158Uns poucos refinamentos mais: faça a entrada de detalhes dos usuários e os comandos do mysql interativos, usando variáveis em vez de constantes, e permita que vários comandos SQL sejam inseridos, até que o comando quit seja encontrado: veja [[Lazarus Database Tutorial/TryDbpp|full program listing]], onde os detalhes de usuário são inseridos do console e o programa vai para um loop onde os comandos SQL são inseridos do console (sem ponto e vírgula no final) e as respostas são impressas na tela, até que 'quit' é inserido pelo teclado.
131159
132160Veja [[Lazarus Database Tutorial/SampleListing|Sample Console Listing]].
133161
134162### Conectando ao MySQL uma Aplicação Lazarus
135163
136164Este tutorial mostra como conectar o Lazarus ao banco de dados MySQL e executar queries simples usando somente os componentes básicos do Lazarus; ele não usa componentes Data Aware, mas ilustra os princípios de interface com banco de dados.
137165
138166Crie um novo projeto no Lazarus:
139167
140-`Projeto -> Novo Projeto -> Application`
168+```text
169+Projeto -> Novo Projeto -> Application
170+```
141171
142172Um novo formulário gerado automaticamente vai aparecer.
143173
144174Aumente a área do formulário até preencher aproximadamente a metade da tela e renomeie o formulário e o seu caption para 'TryMySQL'.
145175
146176Da aba Standard Component ponha três Edit Boxes do lado superior esquerdo do formulário e imediatamente acima de cada Box ponha um Label. Mude os nomes e captions para 'Host' (e HostLLabel, HostEdit), 'UserName' (e UserLabel, UserEdit) e 'Password' (com PasswdLabel e PasswdEdit). Alternativamente você pode usar componentes LabelledEdit da aba Additional.
147177
148178Selecione a caixa Passwd Edit e encontre a propriedade PasswordChar : mude-a para "*" ou algum outro caractere de modo que quando você escreva uma senha os caracteres não apareçam na tela mas sejam representados por uma série de caracteres "*". Certifique-se de que a propriedade Text para cada Edit Box esteja em branco.
149179
150180Agora ponha outra Edit Box e o Label correspondente no topo direito do formulário. Mude o Label para 'Enter SQL Command' e o seu nome para CommandEdit.
151181
152182Coloque três Buttons no formulário: dois do lado esquerdo sob as Edit Boxes e um do lado direito sob a Command Box.
153183
154184Rotule os botões do lado esquerdo como 'Connect to Database' (ConnectButton) e 'Exit' (ExitButton) e o que está do lado direito como 'Send Query' (QueryButton).
155185
156186Ponha um Memo grande rotulado e nomeado como 'Results' (ResultMemo) abaixo do lado direito, preenchendo a maior parte do espaço disponível. Encontre a propriedade ScrollBars do Memo e selecione ssAutoBoth , de modo que as Scroll Bars apareçam automaticamente se o texto preencheer o espaço. Configure a propriedade WordWrap como True.
157187
158188Ponha uma Status Bar (da aba Common Controls) embaixo no formulário e faça a propriedade SimpleText igual a 'TryMySQL'.
159189
160190Um screenshot do formulário pode ser visto aqui: [Mysql Example Screenshot](http://lazarus-ccr.sourceforge.net/kbdata/trymysqldb.png)
161191
162192Agora você precisa escrever alguns event handlers.
163193
164194As três caixas de edição à esquerda são para a inserção do hostname, do username e da password. Quando elas são inseridas satisfatoriamente, o botão de conexão é clicado. O eventhandler OnClick para este botão é baseado em parte do seguinte programa FPC em modo texto.
165195
166196As respostas do banco de dados não podem agora ser escritas usando os estamentos Pascal write e writeln: em vez disso, as respostas têm que ser convertidas em strings e mostradas no Memo. Mesmo que os estamentos Pascal write e writeln sejam capazes de realizar muitas conversões rápidas de tipo, o uso do Memo para saída de texto necessita da conversão explícita de tipo de dados para a forma correta de string, portanto variáveis PChar têm que ser convertidas para strings usando StrPas e inteiros precisam ser convertidos com IntToStr.
167197
168198Strings são mostradas no Memo fazendo
169199
170-`procedure ShowString (S : string);`\
171-`(* display a string in a Memo box *)`\
172-`begin`\
173-`       trymysqlForm1.ResultsMemo.Lines.Add (S)`\
174-`end;`
200+``` pascal
201+procedure ShowString (S : string);
202+(* display a string in a Memo box *)
203+begin
204+ trymysqlForm1.ResultsMemo.Lines.Add (S)
205+end;
206+```
175207
176208The ConnectButton event handler thus becomes:
177209
178-`procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);`\
179-`(* Connect to MySQL using user data from Text entry boxes on Main Form *)`\
180-`var strg: string;`\
181-` `\
182-`begin`\
183-` `\
184-` dummy1 :=  trymysqlForm1.HostEdit.text+#0;`\
185-` host := @dummy1[1];`\
186-` dummy2 := trymysqlForm1.UserEdit.text+#0;`\
187-` user := @dummy2[1] ;`\
188-` dummy3 := trymysqlForm1.PasswdEdit.text+#0;`\
189-` passwd := @dummy3[1] ;`
210+``` pascal
211+procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);
212+(* Connect to MySQL using user data from Text entry boxes on Main Form *)
213+var strg: string;
214+
215+begin
216+
217+ dummy1 := trymysqlForm1.HostEdit.text+#0;
218+ host := @dummy1[1];
219+ dummy2 := trymysqlForm1.UserEdit.text+#0;
220+ user := @dummy2[1] ;
221+ dummy3 := trymysqlForm1.PasswdEdit.text+#0;
222+ passwd := @dummy3[1] ;
223+```
190224
191-` alloc := mysql_init(PMYSQL(@qmysql));`\
192-` sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);`\
193-` if sock=Nil then`\
194-`   begin`\
195-`     strg :='Couldn''t connect to MySQL.'; showstring (strg);`\
196-`     Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg);`\
197-`  end`\
198-`   else`\
199-`   begin`\
200-`     trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';`\
201-`     strg := 'Now choosing database : ' + database; showstring (strg);`\
202-`{$ifdef Unix}`\
203-`     strg :='Mysql_port      : '+ IntToStr(mysql_port); showstring (strg);`\
204-`     strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);`\
205-`{$endif}`\
206-`     Strg :='Host info       : ' + StrPas(mysql_get_host_info(sock));`\
207-`     showstring (strg);`\
208-`     Strg :='Server info     : ' + StrPas(mysql_stat(sock)); showstring (strg);`\
209-`     Strg :='Client info     : ' + Strpas(mysql_get_client_info);  showstring (strg);`\
210-` `\
211-`     trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...';`\
212-` if mysql_select_db(sock,DataBase) < 0 then`\
213-` begin`\
214-`   strg :='Couldn''t select database '+ Database; ShowString (strg);`\
215-`   Strg := mysql_error(sock); ShowString (strg);`\
216-` end`\
217-` end;`\
218-`end;`
225+``` pascal
226+ alloc := mysql_init(PMYSQL(@qmysql));
227+ sock := mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
228+ if sock=Nil then
229+ begin
230+ strg :='Couldn''t connect to MySQL.'; showstring (strg);
231+ Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg);
232+ end
233+ else
234+ begin
235+ trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';
236+ strg := 'Now choosing database : ' + database; showstring (strg);
237+{$ifdef Unix}
238+ strg :='Mysql_port : '+ IntToStr(mysql_port); showstring (strg);
239+ strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);
240+{$endif}
241+ Strg :='Host info : ' + StrPas(mysql_get_host_info(sock));
242+ showstring (strg);
243+ Strg :='Server info : ' + StrPas(mysql_stat(sock)); showstring (strg);
244+ Strg :='Client info : ' + Strpas(mysql_get_client_info); showstring (strg);
245+
246+ trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...';
247+ if mysql_select_db(sock,DataBase) < 0 then
248+ begin
249+ strg :='Couldn''t select database '+ Database; ShowString (strg);
250+ Strg := mysql_error(sock); ShowString (strg);
251+ end
252+ end;
253+end;
254+```
219255
220256A 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.
221257
222258O 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.
223259
224260Uma 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.
225261
226262O código para SendQuery é o seguinte:
227263
228-`procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);`\
229-`var`\
230-` dumquery, strg: string;`\
231-`begin`\
232-`     dumquery := TrymysqlForm1.CommandEdit.text;`\
233-`     dumquery := dumquery+#0;`\
234-`     query := @dumquery[1];`\
235-`     trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...';`\
236-`     strg := 'Executing query : ' + dumQuery; showstring (strg);`\
237-`     if (mysql_query(sock,Query) < 0) then`\
238-`     begin`\
239-`       Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg);`\
240-`     end`\
241-`     else`\
242-`     begin`\
243-`       recbuf := mysql_store_result(sock);`\
244-`       if RecBuf=Nil then`\
245-`       begin`\
246-`         Strg :='Query returned nil result.'; showstring (strg);`\
247-`       end`\
248-`       else`\
249-`       begin`\
250-`         strg :='Number of records returned  : ' + IntToStr(mysql_num_rows (recbuf));`\
251-`         Showstring (strg);`\
252-`         Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf));`\
253-`         showstring (strg);`\
254-`         rowbuf := mysql_fetch_row(recbuf);`\
255-`         while (rowbuf <>nil) do`\
256-`         begin`\
257-`              Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' +`\
258-`               rowbuf[2] +')';`\
259-`              showstring (strg);`\
260-`              rowbuf := mysql_fetch_row(recbuf);`\
261-`         end;`\
262-`       end;`\
263-`     end;`\
264-`end;`
264+``` pascal
265+procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);
266+var
267+ dumquery, strg: string;
268+begin
269+ dumquery := TrymysqlForm1.CommandEdit.text;
270+ dumquery := dumquery+#0;
271+ query := @dumquery[1];
272+ trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...';
273+ strg := 'Executing query : ' + dumQuery; showstring (strg);
274+ if (mysql_query(sock,Query) < 0) then
275+ begin
276+ Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg);
277+ end
278+ else
279+ begin
280+ recbuf := mysql_store_result(sock);
281+ if RecBuf=Nil then
282+ begin
283+ Strg :='Query returned nil result.'; showstring (strg);
284+ end
285+ else
286+ begin
287+ strg :='Number of records returned : ' + IntToStr(mysql_num_rows (recbuf));
288+ Showstring (strg);
289+ Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf));
290+ showstring (strg);
291+ rowbuf := mysql_fetch_row(recbuf);
292+ while (rowbuf <>nil) do
293+ begin
294+ Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' +
295+ rowbuf[2] +')';
296+ showstring (strg);
297+ rowbuf := mysql_fetch_row(recbuf);
298+ end;
299+ end;
300+ end;
301+end;
302+```
265303
266304Salve seu projeto, pressione Run -\> Run
267305
268306#### Download do Código-Fonte do MYSQL
269307
270308Uma listagem completa do programa está disponível aqui [Sample Source Code](http://lazarus-ccr.sourceforge.net/kbdata/mysqldemo.tar.gz)
271309
272310## Lazarus e PostgreSQL
273311
274312Este é um pequeno tutorial usando Lazarus 0.9.12 ou posterior para se conectar a um banco de dados PostgreSQL, local ou remoto, usando o componente TPQConnection.
275313
276314Após a instalação correta, siga estes passos:
277315
278316- Coloque um PQConnection da aba SQLdb
279317- Coloque um SQLQuery da aba SQLdb
280318- Coloque um SQLTransaction da aba SQLdb
281319- Coloque um DataSource da aba DataAccess
282320- Coloque um DBGrid da aba DataControls
283321
284322- No PQConnection preencher:
285323 - "transaction property" com o respectivo objeto SQLTransaction
286324 - Database name
287325 - HostName
288326 - UserName + password
289327
290328- Verifique se o SQLTransaction foi automaticamente alterado para apontar para o PQConnection
291329
292330- No SQLQuery preencher:
293331 - "transaction property" com o respectivo objeto
294332 - "database property" com o respectivo objeto
295333 - SQL (algo como 'select * from nometabela')
296334
297335- No objeto DataSource preencher a propriedade DataSet com o objeto SQLQuery
298336
299337- No DBGrid preencher o datasource como o DataSource Object
300338
301339Mude tudo para connected (conectado) e active (ativo) e o DBGrid deverá ser preenchido em tempo de desenho. TDBText e TDBEdit parece funcionar mas (para mim) eles apenas mostram dados ( _show_ _data_).
302340
303341Para alterar conteúdos no banco de dados, chamei o DB Engine direto com o seguinte código:
304342
305-` try`\
306-`   sql:= 'UPDATE table SET setting=1';`\
307-`   PQDataBase.Connected:=True;`\
308-`   PQDataBase.ExecuteDirect('Begin Work;');`\
309-`   PQDataBase.ExecuteDirect(sql);`\
310-`   PQDataBase.ExecuteDirect('Commit Work;');`\
311-`   PQDataBase.Connected:=False;`\
312-` except`\
313-`   on E : EDatabaseError do`\
314-`     MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);`\
315-`   on E : Exception do`\
316-`     MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);`\
317-` end;`
343+``` pascal
344+ try
345+ sql:= 'UPDATE table SET setting=1';
346+ PQDataBase.Connected:=True;
347+ PQDataBase.ExecuteDirect('Begin Work;');
348+ PQDataBase.ExecuteDirect(sql);
349+ PQDataBase.ExecuteDirect('Commit Work;');
350+ PQDataBase.Connected:=False;
351+ except
352+ on E : EDatabaseError do
353+ MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
354+ on E : Exception do
355+ MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
356+ end;
357+```
318358
319359- Notas:
320360 - Testado no windows, Lazarus 0.9.12 + PgSQL 8.3.1
321361 - Alguns testes em linux, Lazarus 0.9.12 and PgSQL 8.0.x
322362
323363- Instalação e erros:
324364 - Na versão testada do Lazarus .12, campos do tipo "text" e "numeric" tem bugs
325365 - Usei sem problemas "char fixed size", "int" e "float8"
326366 - Às vezes reiniciar o Lazarus resolve erros estúpidos...
327367 - Depois de alguns erros, as transações permanecem ativas e devem ser desativadas manualmente
328368 - As alterações feitas no Lazarus são, naturalmente, não visível até a transação ser confirmada
329369 - The integrated debugger seems buggy (at least in windows) - sometimes running outside of the IDE may help to find errors
330370 - (O depurador integrado parece infestado (pelo menos no windows) - às vezes executando fora da IDE pode ajudar a encontrar erros)
331371 - 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
332372 - Erro: "Can not load Postgresql client. Is it installed (libpq.so) ?"
333373 - Adicione o caminho para pesquisa libpq* da instalação PostgreSQL.
334374 - 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
335375 - No windows, adicione essas "libs" em qualquer lugar na variável de ambiente Path ou diretório de project
336376 - Em windows, copiei todas as DLLs do diretório C:\Program Files\PostgreSQL\8.1\bin para outro diretório no PATH
337377 - Ou adicionar este diretório postgres \bin para o caminho
338378
339379## Lazarus and SQLite
340380
341381by Luiz Américo Translated by Edson Leonel de oliveira
342382
343383### Introduction
344384
345385TSqliteDataset 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:
346386
347387Vantagens:
348388
349389- 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
350390- 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
351391- Rápido: faz um cache dos dados na memória, navegando rapidamente nos dados
352392- Sem configuração e instalação de servidor: conecta-se usando a biblioteca dinâmica sqlite
353393
354394Disvantagens
355395
356396- Requer arquivo externo (biblioteca sqlite)
357397
358398### Requirementos
359399
360400- Para bases de dados sqlite2:
361401 - fpc 2.0.0
362402 - Lazarus 0.9.10
363403 - biblioteca runtime sqlite 2.8.15 ou acima (pegar em www.sqlite.org)
364404
365405- Para bases de dados sqlite3:
366406 - fpc 2.0.2
367407 - Lazarus 0.9.11 (svn revisão 8443 ou acima)
368408 - biblioteca runtime sqlite 3.2.1 ou acima (pegar em www.sqlite.org)
369409
370410**Antes de inicalizar um projeto lazarus, tenha certeza que:**
371411
372412- a biblioteca sqlite esteja no PATH do sistema ou em um diretório executável
373413- sob o Linux, colocar **cmem** como a primeira unidade nas cláusulas em uso na rotina principal (main)
374414
375415### How To Use (Basic Usage)
376416
377417Install the package found at /components/sqlite directory (see instructions [[Install Packages|here]])
378418
379419At design time set the following properties:
380420
381421- FileName: path of the sqlite file \[required\]
382422- TableName: name of the table used in the sql statement \[required\]
383423- Sql: a SQL select statement \[optional\]
384424
385425**Creating a Table (Dataset)**
386426
387427Double click in the component icon or use the 'Create Table' item of the popup menu that appears when clicking the right mouse button. A simple self-explaining table editor will be show.
388428
389-` Here is all field types supported by TSqliteDataset and TSqlite3Dataset: `\
390-` `\
391-` Integer`\
392-` AutoInc`\
393-` String`\
394-` Memo`\
395-` Bool `\
396-` Float`\
397-` Word`\
398-` DateTime`\
399-` Date`\
400-` Time`\
401-` LargeInt`\
402-` Currency`\
403-` `
429+```text
430+ Here is all field types supported by TSqliteDataset and TSqlite3Dataset:
431+
432+ Integer
433+ AutoInc
434+ String
435+ Memo
436+ Bool
437+ Float
438+ Word
439+ DateTime
440+ Date
441+ Time
442+ LargeInt
443+ Currency
444+```
404445
405446**Retrieving the data**
406447
407448After creating the table or with a previously created Table, open the dataset with Open method. If the SQL property was not set then all records from all fields will be retrieved, the same if you set the SQL to:
408449
409-` SQL:='Select * from TABLENAME'; `
450+``` pascal
451+ SQL:='Select * from TABLENAME';
452+```
410453
411454**Applying changes to the underlying datafile**
412455
413456To use the ApplyUpdates function, the dataset must contain at least one field that fills the requirements for a Primary Key (values must be UNIQUE and not NULL)
414457
415458It's possible to do that in two ways:
416459
417460- Set PrimaryKey property to the name of a Primary Key field
418461- Add an AutoInc field (This is easier since the TSqliteDataSet automatically handles it as a Primary Key)
419462
420463If one of the two conditions is set then just call
421464
422-` ApplyUpdates;`
465+```text
466+ ApplyUpdates;
467+```
423468
424469PS1: If both conditions are set, the field corresponding to PrimaryKey is used to apply the updates.
425470
426471PS2: 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.
427472
428473### Remarks
429474
430475- 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).
431476- The same datafile (Filename property) can host several tables/datasets
432477- Several datasets (different combinations of fields) can be created using the same table simultaneously
433478- 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
434479- 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
435480- 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.
436481
437482Generic examples can be found at fpc/fcl/db/sqlite CVS directory
438483
439484Luiz Américo pascalive(at)bol(dot)com(dot)br
440485
441486## Lazarus and MSSQL
442487
443488It is working with Zeoslib (latest cvs), see the links on bottom of page.
444489
445490## Lazarus e Interbase / Firebird
446491
447492Olhe [[Install Packages]]. On this page is a first small example en explanation about how to connect to an IB or FB server. Aqui o início de tradução (e atualização):
448493
449494No diretório onde o Lazarus é instalado você vai encontrar subdiretórios, e o primeiro (alfabeticamente) chama-se **components**. Este, por sua vez, tem subdiretórios como **sqlite** e **sqldb**. O primeiro contém componentes de conexão com o BD e descendentes de Tdataset para o respectivo banco, enquanto o **sqldb** é mais genérico pois consiste de TSQLQuery (um TDataset) e TSQLTransaction usados para todos os tipos de BD e uma T??Conection para realizar a conexão. Nesse artigo vamos instalar o pacote **sqldb** juntamente com a conexão para **Interbase**. Antes, porém, de iniciar a instalação do pacote seria bom discutir o porque de Lazarus não instalar componentes de conexão com o BD. Esses componentes precisam das bibliotecas clientes para funcionar no PC onde são usados. Como o Lazarus atualmente não suporta ligações dinâmicas, todas as bibliotecas precisam ser compiladas para a IDE. Como não se espera que os desenvolvedores tenham todos os BD instalados, não é possível ter como padrão instalar os componentes de conexão. Delphi também só instala os componentes de BD que são prontamente encontrados no computador (componentes ADO) e componentes que não necessitam bibliotecas (BDE: Paradox, DBase). Para instalar o pacote vá em *Pacotes → Abrir arquivo de pacote*. No diálogo seguinte navegue para */usr/bin/lazarus/components/sqldb* ou ao diretório correspondente em OS X ou Windows e escolha o arquivo **sqldblaz.lpk**. Se tudo correr como planejado você verá o Gerenciador de Pacotes, que exibe uma árvore com os arquivos do pacote e os pacotes requeridos. Então pressione **Compilar** se você não quer instalar o componente na IDE, caso contrário clique em **Instalar**. Nesse caso aparecerá uma advertência explicando que o Lazarus suporta apenas ligações a bibliotecas estáticas e pergunta se quer reconstruir Lazarus. Pressione **Sim** e o programa será reconstruido. Se tudo correu bem você verá uma nova palheta chamada **SQLdb** e seu último componente da direita é justamente o de conexão com bancos Firebird ou InterBase.
450495
451496Para instalar o Firebird e criar/gerenciar banco de dados, olhe esse artigo de José Ribeiro: <http://www.vivaolinux.com.br/artigo/Criando-um-banco-de-dados-no-Flamerobin-(Firebird)/>
452497
453498Also work with the latest Zeoslib (from cvs).
454499
455500### FBLib Firebird Library
456501
457502[FBLib](http://fblib.altervista.org/) é uma biblioteca open source para acesso direto (sem Data Aware) ao Firebird.
458503
459504Características atuais incluem:
460505
461506- Acesso direto ao Firebird 1.0.x 1.5.x Classic ou SuperServer
462507- Multiplataforma (Win32, Gnu/Linux, FreeBSD)
463508- Seleção automática da biblioteca cliente 'fbclient' ou 'gds32'
464509- Query com parâmetros
465510- Suporta dialetos SQL 1 e 3
466511- Licença LGPL
467512- Extração de Metadata
468513- Parser Simples de Scripts
469514- Apenas 100-150 KB adicionados ao executável
470515- Suporta campos BLOB
471516- Exporta dados para HTML SQL Script
472517- Gerenciador de Serviço (backup, restore, gfix...)
473518- Alerta de Eventos
474519
475520Você pode acessar a documentação em [FBLib's website](http://fblib.altervista.org/).
476521
477522[Aqui](http://www.firebirdnews.org/?p=1769) você encontra uma versão atualizada. Ou, diretamente pelo SVN: [1](https://tiopf.svn.sourceforge.net/svnroot/tiopf/3rdParty/FBLib/Trunk)
478523
479524## Lazarus and dBase
480525
481526Tony Maro
482527
483528You might also want to visit the beginnings of the [[Lazarus Tdbf Tutorial|TDbf Tutorial page]]
484529
485530FPC includes a simple database component that is similar in function to the Delphi TTable component called "TDbf" ([TDbf Website](http://tdbf.sourceforge.net/)) that supports a very basic subset of features for dBase files. It is not installed by default, so you will first need to install the Lazarus package from the "lazarus/components/tdbf" directory and rebuild your Lazarus IDE. It will then appear next to the TDatasource in your component palette.
486531
487532The TDbf component has an advantage over other database components in that it doesn't require any sort of runtime database engine, however it's not the best option for large database applications.
488533
489534It's very easy to use. Simply, put, drop a TDbf on your form, set the runtime path to the directory that your database files will be in, set the table name, and link it to your TDatasource component.
490535
491536Real functionality requires a bit more effort, however. If a table doesn't already exist, you'll need to create it programmatically, unless there's a compatible table designer I'm not familiar with.
492537
493538Attempting to open a non-existant table will generate an error. Tables can be created programmatically through the component after the runtime path and table name are set.
494539
495540For instance, to create a table called "dvds" to store your dvd collection you would drop it on your form, set the runtime path, and set the table name to "dvds". The resulting file will be called "dvds.dbf".
496541
497542In your code, insert the following:
498543
499-`   Dbf1.FilePathFull := '/path/to/my/database';`\
500-`   Dbf1.TableName := 'dvds';`\
501-`   With Dbf1.FieldDefs do begin`\
502-`       Add('Name', ftString, 80, True);`\
503-`       Add('Description', ftMemo, 0, False);`\
504-`       Add('Rating', ftString, 5, False);`\
505-`   end;`\
506-`   Dbf1.CreateTable;`
544+``` pascal
545+ Dbf1.FilePathFull := '/path/to/my/database';
546+ Dbf1.TableName := 'dvds';
547+ With Dbf1.FieldDefs do begin
548+ Add('Name', ftString, 80, True);
549+ Add('Description', ftMemo, 0, False);
550+ Add('Rating', ftString, 5, False);
551+ end;
552+ Dbf1.CreateTable;
553+```
507554
508555When 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.
509556
510557Adding 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:
511558
512-`   Dbf1.Exclusive := True;`\
513-`   Dbf1.Open;`\
514-`   Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);`\
515-`   Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);`\
516-`   Dbf1.Close;`
559+``` pascal
560+ Dbf1.Exclusive := True;
561+ Dbf1.Open;
562+ Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);
563+ Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);
564+ Dbf1.Close;
565+```
517566
518567The 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.
519568
520569I 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!
521570
522571## Related Links
523572
524573- [[Databases|Creating Databases Applications with Lazarus using the DB-unit]]\
525574- [[MySQLDatabases|Creating a database application using MySQL]]\
526575- [[Zeos tutorial|Creating a database application using the Zeos components]]
527576- 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.
528577
529578<https://trac.synsport.com:8000/index.php/pdo/wiki> (username/password is guest/guest)
530579
531580## Contributors and Changes
532581
533582This page has been converted from the epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusDatabase).
534583
535584Lazarus e PostgreSQL, traduzido por User: jrxds (15/01/2012).
536585
537586---
538587*From the Free Pascal wiki, page "Lazarus Database Tutorial/pt", as it stood on 2012-10-28 after a change by JuhaManninen, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
539588Category: Databases/pt

Back to history