Objetivo
Ter o primeiro contato com banco de dados em Lazarus. Aprender a criar um banco de dados MySQL e a usar a API de programao para executar funes simples de acesso e consulta. if [ ! $? = 0 ]; then echo "Falhou." else echo "Feito." fi # Terminado 3. Compile o programa abaixo, que acessar o banco: (fpc testdb4.pp) program qtest; uses mysql4; const DataBase : Pchar = 'testdb'; Query : Pchar = 'Select * from FPdev'; host : Pchar = 'localhost'; user : Pchar = 'z-user'; passwd : Pchar = 'z-password'; var count, num : longint; code : integer; sock : PMYSQL; qmysql : TMYSQL; qbuf : string [160]; rowbuf : TMYSQL_ROW; dummy : string; recbuf : PMYSQL_RES; alloc : PMYSQL; begin if paramcount=1 then begin Dummy:=Paramstr(1)+#0; DataBase:=@Dummy[1]; end; Writeln ('Alocando Espao ...'); alloc := mysql_init (PMYSQL(@qmysql)); Write ('Conectando ao MySQL ...'); sock := mysql_real_connect (alloc, host, user, passwd, DataBase, 0, nil, 0); if sock=Nil then begin Writeln (stderr,'No foi possvel conectar ao MySQL.'); Writeln (stderr, 'O erro foi: ', mysql_error(@qmysql)); halt(1); end; Writeln ('Done.'); Writeln ('Connection data:'); {$ifdef Unix} writeln ('Mysql_port : ',mysql_port); writeln ('Mysql_unix_port : ',mysql_unix_port); {$endif} writeln ('Host info : ',mysql_get_host_info(sock)); writeln ('Server info : ',mysql_stat(sock)); writeln ('Client info : ',mysql_get_client_info); Writeln ('Selecionando o Banco',DataBase,'...'); if mysql_select_db (sock,DataBase) < 0 then begin Writeln (stderr,'No foi possvel selecionar o Banco', Database); Writeln (stderr,mysql_error (sock)); halt (1); end; Writeln ('Executando consulta: ',Query,'...'); if (mysql_query (sock,Query) < 0) then begin Writeln (stderr,'Query failed ');
Componentes Utilizados
Form, Label, Edit , Button e Memo.
MySQL
Este projeto ensina a conectar o Lazarus ao MySQL 4 e a executar consultas simples, usando apenas componentes bsicos do Lazarus.
Desenvolver o Projeto
Primeira Fase Linha de Comando 1. Crie um banco de dados MySQL, a partir de um shell unix. No esquea que o mysql server deve estar rodando:
/etc/rc.d/init.d/mysqld start (como root) Agora, acesse o servidor (o root do mysql no o mesmo root do linux). mysql -u root -p mysql> create database testdb; mysql> use mysql; mysql> grant all on testdb to z-user indentified by 'z-password'; mysql> flush privileges; mysql> quit
2. Rode o script mkdb, que criar a tabela FPdev, no banco testdb. #!/bin/sh # # Script para criar uma tabela 'FPdev' e preench-la com dados. # O script aceita um argumento opcional : # A que banco de dados se conectar (default 'testdb'). echo -n "Criando e populando a tabela FPdev do banco de dados ${1-testdb}..." mysql -u root ${1-testdb} -p << EOF >/dev/null # Elimina a tabela caso ela j exista. DROP TABLE IF EXISTS Fpdev; # Cria a tabela. CREATE TABLE FPdev ( id INT NOT NULL, UserName CHAR(255), InstEmail CHAR(255), PRIMARY KEY (id), INDEX (id) ); insert into FPdev values ('1','Michael Van Canneyt', 'Michael@tfdec1.fys.kuleuven.ac.be'); insert into FPdev values ('2','Florian Klaempfl', 'ba2395@fen.baynet.de'); insert into FPdev values ('3','Carl-Eric Codere', 'codc01@gel.usherb.ca'); insert into FPdev values ('4','Dani Mantione', 'd.s.p.mantione@twi.tudelft.nl'); insert into FPdev values ('5','Pierre Muller', 'muller@europe.u-strasbg.fr'); insert into FPdev values ('6','Jonas Maebe', 'jmaebe@mail.dma.be'); insert into FPdev values ('7','Peter Vreman', 'pfv@worldonline.nl'); insert into FPdev values ('8','Gerry Dubois', 'gerry@webworks.ml.org'); EOF # Em bash, o valor de retorno de um programa armazenado # numa varivel chamada $?
Pgina 1 de 5
mysql_query(
MYSQL *mysql, const char *query)
Executa a consulta SQL apontada pela string no nula query. A consulta deve consistir de um nico comando SQL. No deve ser adicionado um terminador ; ou \g ao comando. mysql_query() no pode ser usada para consultas que contenham dados binrios; neste caso, deve ser usada mysql_real_query() . (Dados binrios podem conter o caracter \0, que o mysql_query() interpreta como o final da string de consulta). Retorna zero se a consulta foi bem sucedida ou um valor diferente de zero, se ocorreu algum erro. MYSQL_ROW mysql_fetch_row (MYSQL_RES *result) Retorna a prxima linha de um conjunto resultado ou NULL, se no houver mais linhas. 5) MYSQL_RES *mysql_store_result (MYSQL *mysql) Deve-se chamar mysql_store_result() para cada consulta bem sucedida que retorne dados (Select, Show, Describe, Explain). O resultado completo de uma consulta do cliente lido, uma estrutura MYSQL_RES alocada e recebe o resultado. 6) void
Libera a memria alocada pelo conjunto resultado das funes mysql_store_result(), mysql_use_result(), mysql_list_dbs(), etc... 7) int mysql_select_db ( MYSQL *mysql, const char *db) Faz com que o Banco de Dados especificado por db seja o default (corrente) na conexo especificada por mysql. Em consultas subseqentes, este banco de dados o default em todas as referncias a tabelas que no incluam um especificador explicito. 8) unsigned long mysql_num_rows ( MYSQL_RES *result) Retorna o nmero de linhas (registros) de um conjunto resultado 9) unsigned int mysql_num_fields (
1)
MYSQL *mysql_init (MYSQL *mysql) Aloca ou inicia um objeto MYSQL adequado chamada da funo mysql_real_connect().
2)
MYSQL*
mysql_real_connect(
MYSQL *mysql, const char *host, const char *user,
Pgina 2 de 5
1.
Crie um novo projeto. Renomeie o formulrio para TryMYSQL e adicione trs EditBox: Host (HostLabel e HostEdit). Username (UserLabel e UserEdit). Password (PasswdLabel e PasswdEdit). Selecione o TEdit Passwd e encontre a propriedade PasswordChar. Mude-a para *, ou algum outro caracter, para que quando voc digite a senha os caracteres no apaream na tela, e apenas seja ecoado uma srie de *. Certifique-se de que a propriedade Text de cada EditBox esteja em branco. Coloque um outro EditBox e Label no topo do lado direito do formulrio. Mude o label para 'Enter SQL Command' e chame-o de CommandEdit. Coloque trs Botes no formulrio: altere a propriedade Text para 'Connect to Database' (ConnectButton), 'Exit' (ExitButton) e 'Send Query' (QueryButton). Adicione um MemoBox com Text 'Results' (ResultMemo). Encontre a propriedade ScrollBars e selecione ssAutoBoth, para que os scroll bars apaream automaticamente se o texto ocupar todo o espao. Torne verdadeira a propriedade WordWrap. Adicione um StatusBar (a partir do Common Controls tab) e mude a propriedade SimpleText para 'TryMySQL'. Declare as seguintes variveis na seo implementation: const DataBase : Pchar = 'testdb'; var sock : PMYSQL;
2.
3.
4.
5.
6.
7.
Pgina 3 de 5
Pgina 4 de 5
Tarefa Acrescentar: 1. 2. 3. Permitir a seleo do banco de dados a ser manipulado. Permitir a execuo do comando Show tables; (formatao adequada das strings). Escrever cdigo para montar as consultas baseadas nos campos do banco de dados, sem a necessidade do usurio conhecer a sintaxe dos comandos MySQL (uma caixa de dados para cada campo).
Silva",
Pgina 5 de 5