Mostrando postagens com marcador MySQL. Mostrar todas as postagens
Mostrando postagens com marcador MySQL. Mostrar todas as postagens

quarta-feira, 4 de março de 2009

Acesso a banco de dados MySQL


Olá pessoal...

Bom sendo este o meu primeiro post aqui no Include C/C++ e este post se destina a criar uma aplicação que tenha acesso a um banco de dados MySQL. Então vamos lá, agora que vocês já devem ter tudo funcionando 100% após ter lido o post Compilando C/C++ no Linux e no Windows.

Agora então agora é necessário instalar o servidor de banco de dados MySQL. No linux basta digitar apt-get install mysql-server-X.X onde X é a versão. Nós iremos utilizar a 5.0 (mysql-server-5.0). São aproximadamente 36MB. Após baixado e instalado uma senha é requisitada, eu utilizei a famosa senha 123.

Para que se consiga utilizar a biblioteca mysql é necessário baixar a libmysqlclient-dev, também através do apt-get.

Com o serviço instalado vamos criar as tabelas, para isto abra um terminal e digite mysql --user=root -p, então pedirá uma senha, esta senha é do root do MySQL então vamos inserir a senha que você definiu (no meu caso 123) e pronto estamos conectados com o serviço. Vamos então digitar...


create database acessodb;

connect acessodb;

CREATE TABLE `usuarios` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`usuario` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5;

INSERT INTO `usuarios` (`id`, `usuario`) VALUES
(1, 'Mauricio Sipmann'),
(2, 'Bolivar Arthur Butzke'),
(3, 'Helton Ritter'),
(4, 'Michel de Sousa');


Então ta, criamos um banco de dados, criamos a tabela e inserimos uns dados para podermos testar o banco, para sair do serviço basta digitar exit. Agora para conectar

Feito isto vamos para o código-fonte do progrma em C++.


#include // Para usar o cin.get
#include // mysql/mysql.h biblioteca mysql
#include // para usar o istringstream

using namespace std;

int main(void)
{
MYSQL DBCon; // Vairiavel de conexão
MYSQL_RES *result; //variável que recebe o resultado
MYSQL_ROW dados; //variável que recebe os dados

int ID; // Converter para integer

// Inicia a variável DBCon
mysql_init(&DBCon);

//Conecta com o banco de dados
if ( mysql_real_connect(&DBCon, "127.0.0.1", "root", "", "acessoaobd", 0, NULL, 0) )
{
printf("Conectado!\n\n");
}
else
{
//Escreve o erro que ocorreu
printf("Erro n %d : %s\n", mysql_errno(&DBCon), mysql_error(&DBCon));
cin.get(); //Espera o usuário pressionar uma tecla
cin.get();
return 1;
}

// Executa a consulta
if(mysql_query(&DBCon,"select * from usuarios"))
{
printf("Erro n %d : %s\n",mysql_errno(&DBCon),mysql_error(&DBCon));
cin.get();
cin.get();
return 1;
}

// Recebe os dados da cunsulta
result = mysql_store_result(&DBCon);

// Se consultou (sem erros)
if (result)
{
// Enquanto receber dados vai escrevendo
while ((dados=mysql_fetch_row(result)) != NULL)
{
// Escreve os dados formatados sende estes a ID e o NOME

istringstream buffer(dados[0]); // Cria a variável que recebera a string a ser convertida para int
buffer >> ID; // Convert a string para int
printf("%02d %s\n",ID,dados[1]); // Escreve formatado
}

// Limpa da memória
mysql_free_result(result);

}
else
{
printf("Erro n %d : %s\n", mysql_errno(&DBCon), mysql_error(&DBCon));
cin.get();
cin.get();
return 1;
}
printf("\n");
// Fecha a conexão ...
mysql_close(&DBCon);

return 0;
}

Então vamos as explicações. As primeiras linhas fazem referência às bibliotecas que iremos utilizar, iostream para as funções cout e cin, mysql.h para acessarmos o banco de dados, e sstream para convertermos as variáveis de string para int. O código quinta linha tem a função de minimizar o trabalho teriamos quando utilizássemos o cin.get ou cout << "texto", teríamos que escrever sempre std::cout << "" com este using namespace STD poupamos trabalho. Então definimos as variáveis DBCon, result, dados e ID, a variável DBCon é a nossa conexão com o banco, result é a variável que armazena o resultado de uma consulta e a variável dados é que receberá os dados de cada linha para escrevermos (veremos mais adiante nas explicações). A função mysql_ini(&DBCon) tem a finalidade de incializar a variável de conexão com o banco pois precisaremos dela diversas vezes como verão. Agora uma parte interessante e que vai do gosto de cada um. Existem 2 funções para se conectar com o banco de dados, são elas:
  • MYSQL * mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd);
  • MYSQL * mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int clientflag);
A diferença é que na mysql_real_connet nós já especificamos o banco ao qual queremos nos conectar, já a mysql_connect só conecta e então seria necessário o uso da função mysql_select_db. Nós usaremos a real_connect, onde são necessários os seguintes parâmetros:



mysql_real_connect(variavel_de_conexao(&DBCon),"servidor(127.0.0.1)","usuario(root)","senha(123)","banco_de_dados(acessodb)",porta_de_conexão(0 para padrão),socket(NULL para padrão), flags_do_cliente(0 para padrão));




Caso ocorra algum erro utilizamos a função printf("Erro n %d: %s",mysql_errno(&DBCon), mysql_error(&DBCon)) onde formatamos para receber um inteiro e uma string, onde mysql_errno traz o numero do erro e mysql_error traz a mensagem de erro, então adicionamos 2 vezes cin.get() e um return 1 para que espere o usuário pressionar qualquer tecla para que finalize o programa.

Então chegamos a parte de execução de uma consulta com o mysql_query(&DBCon,"select * from usuarios"), então esta na cara, variável de conexão e em seguida a nossa SQL de seleção, e também é claro um tratamento de erro.

O pŕoximo passo então é armazenar o resultado completo da consulta em uma variável que é a variável result, result = mysql_store_result(&DBCon), esta função é necessário somente passar a variável de conexão, e como padrão checar se não houve erros durante a seleção. Após tudo isto chegamos na parte em que os dados serão exibidos... para isto é necessário fazer um laço para percorrer todas as linhas que retornaram do banco de dados, por isso o while, onde a variável dados recebe a linha atual, ele se transforma numa array.

É dentro do laço que é feito a conversão do campo ID que é string para int para que assim seja possível formatar o valor retornado com o printf.

istringstream buffer(dados[0]); // Cria a variável e já atribui o valor para ela
buffer >> ID; // Convert a string para int

Portanto o índice 0 da array dados é a ID, então o indece 1 é o campo usuário, e assim segue para cada campo seguinte. A formatação usada no printf %02d é utilizada para que sempre seja impresso numero com 2 casas decimais... EX: 04

Concluindo o código o mysql_free_result limpa da memória a pesquisa e o mysql_close encerra a conexão com o banco de dados. Bom, código feito, é hora de compilar, no linux para compilar (lembrando que este é um código C++) seria:

  • g++ -c arquivo.cpp -lmysqlclient

  • g++ -o arquivo arquivo.o -lmysqlclient



Bom... Para que este -lmysqlclient?? Ele é usado para associar a libmysql-cliet-dev que nós baixamos antes ao nosso sistema.

Então esta ai. Espero que tenham gostado. Até a próxima...