.:: Menu Rápido ::.

Linux | C/C++ | Downloads | SDL | [×]

segunda-feira, 8 de outubro de 2007

Conexão com API C do MySQL

O MySQL é um servidor de banco de dados. Isso significa que ele fica rodando na máquina à espera que uma conexão socket solicite um serviço. Sua API é escrita originalmente em C pela equipe MySQL e depois é transcritas para outras linguagens por outros grupos. É muito comum utilizar o PHP para fazer conexões com o MySQL, mas no meu site a prioridade é C !
Farei uma pequena abordagem da libmysql, até porque também é novidade para mim !

» Post Completo...

  • mysql_init() - Obtem ou inicializa uma estrutura MYSQL.
  • mysql_close() - Fecha uma conexão com o servidor.
  • mysql_real_connect() - Conecta ao servidor MySQL.
  • mysql_errno() - Retorna o número do erro ocorrido recentemente.
  • mysql_error() - Retorna a mensagem do erro ocorrido recentemente.
  • mysql_real_escape_string() - Escapa caracteres especiais em uma string para ser utilizada em uma instrução SQL.
  • mysql_query() - Executa uma consulta SQL especificada com uma string terminada com null.
  • mysql_real_query() - Executa uma consulta SQL especificada como uma string fixa.
  • mysql_insert_id() - Retorna o ID gerado para uma coluna AUTO_INCREMENT pela consulta anterior.
  • mysql_store_result() - Recupera um resultado completo para o cliente.
  • mysql_fetch_fields() - Retorna um vetor de todas as estruturas do campo.
  • mysql_fetch_lengths() - Retorna o tamanho de todas as colunas na linha atual.
  • mysql_num_fields() - Retorna o número de colunas em um conjunto de resultados.
  • mysql_num_rows() - Retorna o número de linhas em um conjunto de resultados.
  • mysql_fetch_row() - Busca o próximo registro no conjunto de resultados.
  • mysql_field_seek() - Coloca o cursor da coluna em uma coluna específica.
  • mysql_free_result() - Libera a memória usada por um conjunto de resultados.
  • mysql_commit() - Faz um commits na transação.
  • mysql_rollback() - Faz um roll back na transação.
Confira a lista completa no manual da MySQL.

*** Exemplo ***
A seguir, estão em destaque algumas das principais linhas de um exemplo que faz uma consulta no banco. O código completo está disponível aqui !

#include <mysql/mysql.h>
#define host "127.0.0.1"
#define user "banco"
#define senha "senha"
#define banco "banco"

MYSQL *sock = NULL;

int main(void){
//--- socket ---//
sock = mysql_init(0);
...
//--- Conexão ---//
mysql_real_connect(sock,host,user,senha,banco,0,NULL,0);
...
consulta();
...
//--- Fechando a conexão ---//
mysql_close(sock);

return 0;
}

void consulta(){
if( mysql_query(sock,"SELECT * FROM `cliente`") ){
printf("falha: %s.",mysql_error(sock));
}else{
//- solicitando resultado da pesquisa
res = mysql_store_result(sock);
if(res){
num_fields = mysql_num_fields(res);
//--- listando dados ---//
while( (row = mysql_fetch_row(res)) ){
lengths = mysql_fetch_lengths(res);
for(i=0; i<num_fields; i++){
printf("%.*s ", (int)lengths[i], row[i]?row[i]:"NULL");
}
printf("\n");
}
mysql_free_result(res);
}else
printf("Erro: %s\n",mysql_error(sock));
}
}


*** Testando ***

$ make
gcc -o mysql_teste mysql_teste.c `mysql_config --cflags --libs`
$ ./mysql_teste
socket... ok.
conexao... ok.
codificacao: latin1
status: Uptime: 17988 Threads: 1 Questions: 377 Slow queries: 0 Opens: 136 Flush tables: 1 Open tables: 18 Queries per second avg: 0.021

linhas: 2
[cod] [nome] [dt_cadastro] [tipo_compra] [em_parcelam] [em_vencim]
1, João Pessoa Filho, 2007-10-07, comum, 0.00, 0.00
2, Maria da Conceição Batista, 2007-10-07, comum, 0.00, 0.00


*** Link's ***
---
Não foi grande coisa, mas é por aí que as coisas funcionam. Em PHP você faria em quantas linhas ?! Com menos de um terço talvez, mas em momento algum eu estive comparando isso.
Em breve, um outro post sobre como tornar esta aplicação visual. E todo este código em c fará mais sentido !

14 comentários:

Anônimo disse...

Gostei muito importante esse post
nota 20 curto mas preciso, não sei como são as escalas de noas no Brazil por isso é melhor dar 100% ;)

Já agora ORM em C/C++ tens conhecimento?
Tipo Hibernate()

Diogo_RBG disse...

Vlw xiko \o/

xiko disse...
"Já agora ORM em C/C++ tens conhecimento?
Tipo Hibernate()"

Infelizmente eu não sei, mas vou pesquisar sobre o assunto.

Luiz Carvalho disse...

Parabens cara!
muito bom isso ai!

Luiz Carvalho disse...

Muito bom o Post!
parabéns!

Diogo_RBG disse...

Vlw Maximus !
Não achei seu blog, vc tem algum ?!

Anônimo disse...

Otimo post! está de parabens.

Atom disse...

Tambem gostei estava precisando
Um abraço e força

Anônimo disse...

Muito bom o post cara! Só para melhorar ele ainda mais vc deveria colocar a função "void consulta" acima da main, pois nunca vi isso dar certo (pelo menos aqui não deu), e tb tem que declarar as variáveis dessa função, e aí é que tem uma coisa bem interessante que é o fato de algumas delas possuírem tipos definidos para se poder trabalhar com o MySQL. Aí vão as declarações a serem feitas dentro da função "consulta":

MYSQL_RES *res;
int num_fields, i;
MYSQL_ROW row;
unsigned long *lengths;

Adicionando estas linhas dentro da função e colocando a função acima da função principal (main) é só compilar com o comando gcc que vai rodar.

Diogo_RBG disse...

Olá Tony,

Agradeço pela atenção !

Já faz um tempinho que fiz este código, mas acho que ele está funcionando corretamente.

"vc deveria colocar a função "void consulta" acima da main, pois nunca vi isso dar certo"
Realmente não irá dar certo se você escrever uma função abaixo da main() e depois chamá-la. Para resolver este problema nós declaramos todas as funções e só então a implementamos.

void funcao(); // declaração

int main(){
funcao();
}

void funcao(){ // definição
// código
}


Quanto aos tipos definidos, o meio código exibido no blog realmente não tem... e não compila de jeito nenhum, pois ele é só de exemplo. O código funcional é o do link, este deve estar funcionando !

marcus abrahão disse...

ola amigo, sou novo no C, mas ja tenho alguma experiencia com php... eu ja tinha o dev c++ e ai baixei o pacote do link q vc postou, ate ai tudo certo... baixei tbm o arquivo com o projeto e o banco exportado, coloquei tudo em ordem, abri um projeto em C no Dev e colei o codigo, troquei a senha, usuario e nome do banco, e quando eu vou compilar... nao vai... da um montão de erro... um monte mesmo... sendo q tem uns q parecem q sao erros nos arquivos .h e nao no meu codigo... o q sera q esta havendo? obrigado

Diogo_RBG disse...

Olá Marcus,

Os erros de que você mencionou podem ser dos mais variados tipos... mesmo o código estando correto.
Vou ajudar você a resolvê-los. Por favor mande as mensagens de erro para meu email... diogorbg do gmail.

T++

Unknown disse...

Fala Diogo tudo bom? Cara estou fazendo um projeto da faculdade de C++, é um programa de controle financeiro pessoal.. feito no C++ Builder com interface gráfica... Cara já criei a interface gráfica e alguns código... Agora estou a duas semanas mais ou menos quebrando a cabeça com o MYSQL... pq o meu programa vai gravar dados do usuario e seus gastos em tabelas no mysql. O Mysql e o C++ Builder estão instalados corretamentes... conexão com o mysql dentro do c++ builder funcionando blz tbm... Ai vem minha dúvida... quando o usuario acessar o sistema fazer seu cadastro e clicar no botão "ok" apartir deste clique não sei que instrução dar no código do botão para ele capturar os dados que o usuario digitou e gravar no mysql... na internet acho muita coisa sobre consulta no mysql agora gravação de dados não encontro quase nada e quando encontro acho o conteudo muito evasivo. Vi que você tem uma grande habilidade com o c e com o mysql... se puder me dar uma forcinha ficarei muito grato. meu email é yuri_matheus@hotmail.com

Grande abraço,

lhe agradeço desde já.

Att Yuri Santana

Diogo_RBG disse...

Pra trabalhar facim com o mySQL você instala o phpMyAdmin. Ele vai te dar uma interface para manipular o banco e ainda vai mostrar os códigos SQL. Um exemplo onde em faço um cadastro:

INSERT INTO `usuario` (`login` ,`senha`,`sexo` ,`dt_cad` ,`dt_aces` )
VALUES (
'diogorbg', '123456', 'M', NOW( ) , NOW( )
);

Você está utilizando o C++ Builder... logo podem haver maneiras de se fazer isso sem precisar gerar o SQL.

Eu posso dar umas dicas de segurança pra você... mas isso vai depender da aplicação. Se for extremamente simples e sem o conceito cliente/servidor nem precisa se preocupar muito.

A gente pode continuar a discussão por e-mail.
T++

Unknown disse...

Diogo boa noite,

Estou querendo fazer a programação em C++ orientada a objeto para criar um jogo, como posso comunicar a programação com a interface gráfica de meu jogo? Posso utilizar um outro programa gráfico, exemplo 3D Studio Max, autoCad etc. para criar os objetos e depois brincar com a movimentação dos mesmos numa interface comum para C++ e qualquer outro programa?

Preciso de sua ajuda
Obrigada
Eneida