Linux slogan
Visite também: Segurança Linux · BR-Linux.org · Dicas-L · Doode · NoticiasLinux · SoftwareLivre.org · UnderLinux



» Screenshot
Linux: Gadjets X Screenlets
Por pinduvoz
» Login
Login:
Senha:

Se você ainda não possui uma conta, clique aqui.

Esqueci minha senha



Artigo

Usando MySQL na linguagem C
Linux user
jllucca
07/08/2003
Este é um artigo que visa demostrar como podemos usar a linguagem C para realizar as ações básicas em um banco de dados MySQL. As ações básicas num banco de dados são: inserção, remoção, alteração e consulta de dados.
Por: Ricardo Rodrigues Lucca
[ Hits: 129484 ]
Conceito: 8.6   11 voto(s)11 voto(s)11 voto(s)11 voto(s)11 voto(s) + quero dar nota ao artigo

Introdução

Este é um artigo que visa demonstrar como podemos usar a linguagem C para realizar as ações básicas em um banco de dados MySQL. As ações básicas num banco de dados MySQL são:
  • inserção;
  • remoção;
  • alteração e;
  • consulta de dados
Assim, seria recomendável possuir alguma experiência na linguagem SQL.

Inicie, criando um banco de dados chamado "teste" e crie um usuário para acessar esse BD. No caso aqui criarei um usuário chamado "guest" com a senha "guest", depois criaremos uma tabela chamada "aprendendo". Abaixo estão os comandos para você fazer isso no console ou no rxvt (se quiser usar o gráfico):

01 $ mysql --user=root -p
02 Enter password: <senha aqui>
03 Welcome to the MySQL monitor. Commands end with ; or \g.
04 Your MySQL connection id is 8 to server version: 3.23.51-log
05 Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
06 mysql> create database teste;
07 Query OK, 1 row affected (0.00 sec)
08 mysql> grant all on teste.* to guest identified by "guest";
09 Query OK, 0 rows affected (0.06 sec)
10 mysql> flush privileges;
11 Query OK, 0 rows affected (0.03 sec)
12 mysql> exit
13 Bye

Agora vamos comentar isso. Na linha 01, você pede para logar com o usuário administrador do MySQL, que no caso é chamado root (--user=root), mas poderia ser outro. Fora isso, temos também que dizer que para esse usuário será preciso digitar uma senha (-p). Se você não sabe qual é esse usuário, me desculpe, mas consulte a pessoa que instalou o MySQL na sua máquina.

Agora, na linha 06 pedimos para criarmos o banco de dados teste e na linha 08 dizemos que o usuário guest (to guest) com senha guest (identified by "guest") terá todos os direitos no banco de dados teste (grant all on teste.*). Na linha 10, fazemos valer o novo usuário. Assim, só depois desse comando o usuário vai funcionar e exit é para sair (linha 12). Agora você me pergunta: "E a tabela?". Criaremos a tabela usando o usuário que possui direitos nela para irmos nos acostumando a isso! Vamos lá:

$ mysql --user=guest -p
Enter password: <senha aqui>
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 38 to server version: 3.23.51-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> connect teste;
Connection id:    39
Current database: teste

mysql> create table aprendendo (
    -> `ID` INT NOT NULL AUTO_INCREMENT,
    -> `nome` VARCHAR( 40 ) NOT NULL,
    -> `sexo` CHAR( 1 ) NOT NULL,
    -> unique ( `ID` )
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

Isso faz com que você reconecte com o banco de dados teste (connect teste) e depois crie uma tabela chamada aprendendo (create table aprendendo), que possui três colunas:
  • ID: que receberá um inteiro incrementado automaticamente;
  • nome: que será do tipo VARCHAR que não poderá ser vazio;
  • sexo: que será do tipo CHAR, também não podendo ser vazio.
Por fim, definimos uma chave única para a tabela.

Um pequeno comentário quanto aos tipos VARCHAR e CHAR. VARCHAR é usado quando queremos uma economia de espaço nas tabelas. Essa economia é gerada da seguinte forma: podemos inserir no máximo 40 caracteres, sendo que se inserirmos menos, vamos ter uma string da quantidade inserida, ao contrário do tipo CHAR, pois o tipo CHAR sempre vai ter o tipo definido. Isso dá um ganho de velocidade na hora da busca. Se definirmos um CHAR de no máximo 5 e inserirmos 3 caracteres, ele ocupará espaço como se tivesse cinco caracteres.

Próxima página >>




Páginas do artigo
   1. Introdução
   2. Iniciando na programação
   3. Inserção
   4. Consulta
   5. Remoção e alteração
   6. Erro de compilação

Outros artigos deste autor

Leitura recomendada

Comentários
[1] Comentário enviado por repolho em 08/08/2003 - 16:16h:

SHOW de bola esse tutorial era exatamente isto que estava procurando para a minha NetAgenda ;) aUHauHAU
valeus

[2] Comentário enviado por jllucca em 09/08/2003 - 02:39h:

blz... vou postar os scripts em separado...

[3] Comentário enviado por ic3hawk em 29/10/2003 - 17:24h:

Cara, eu não achei o mysql.h!!!!!!


[4] Comentário enviado por jllucca em 30/10/2003 - 00:05h:

Tipo, talvez você precise instalar algum pacote pra ter a biblioteca.

Mas, tenho nem ideia de qual possa ser. Se outra pessoa souber e quiser ajudar... fico grato!

[5] Comentário enviado por zorro em 25/11/2003 - 21:02h:

E so voce instalar o mysql-devel

apt-get install MySQL-devel

[6] Comentário enviado por jllucca em 26/11/2003 - 11:20h:

Valeu pela contribuição, zorro! :)

Eu realmente não sabia o nome do pacote...

[7] Comentário enviado por jllucca em 30/08/2004 - 13:43h:

Apenas pra completar, ao invés de utilizar um falor predefinido ali e sempre constante nas querys podemos criar um ponteiro para char e usar ele para montar uma query usando variaveis do proprio programa.

Ex.:
char* query;
char* tabela = "aprender";
char *nome = "Ricardo Lucca";

sprintf(query, "SELECT * from %s where nome = '%s';", tabela, nome);

É isso, ai!

Qualquer duvidas podem mandar email ainda!

[]'s

[8] Comentário enviado por androle em 23/09/2004 - 18:34h:

Cara, muito bom!
Faz muito tempo que procuro algo como esse seu artigo. Meus parabéns!

Só para colaborar, no debian precisei instalar o libmysqlclient-dev para ter o mysql.h

Valeu!

[9] Comentário enviado por pbetos em 16/11/2004 - 21:53h:

Muito bom.

[10] Comentário enviado por danilolobato em 05/01/2005 - 09:51h:

Valeu cara, faz tempo que eu procurava um tutorial assim, ALGUÉM PODERIA DE INDICAR UM SITE MAIS ESPECÍFICO SOBRE O ASSUNTO?

[11] Comentário enviado por jllucca em 05/01/2005 - 19:44h:

Site que explique conheço um que explica a mesma coisa so q em ingles. Livro tem um chamado Linux Professional muito bom, não só pra esse assunto como para outros...

[12] Comentário enviado por Biudi em 10/01/2005 - 11:51h:

Muito bom esse seu artigo! Me ajudou bastante...estou iniciando com Linux(Conectiva 10) e tô com problemas no MySQL, encontro o seguinte erro:"checking for mysql_init in -lmysqlclient...no", tô sem saber onde encontrar esse pacote,alguém poderia por favor me ajudar?

[13] Comentário enviado por fabiocosta em 25/01/2005 - 12:16h:

ae galera, achei muito interessante este artigo, mas fiquei com uma dúvida que ao longo do texto não consegui tirar. Como executar um código-fonte desses de conexão com mysql se eu ao menos vi uma biblioteca para isso, que no caso seria "<stdio.h>" e "<mysql/mysql.h>", enfim, gostaria de saber como faria pra acessar o mysql, como faria para possuir as bibliotecas.


[14] Comentário enviado por hartax em 18/04/2006 - 22:18h:

Outra duvida, estou comecando agora a programar em C, pra adicionar os dados oriundos de uma variavel? como eh que faz?

[15] Comentário enviado por removido em 20/06/2006 - 12:08h:

eu baixei o MySQL e tentei instalar no meu laptop, mas não consegui por causa de um bloqueio da Fontes de dados (ODBC). Como faço prá resolver isso ? E caso eu use o SQL Professional Edition, dá prá criar o mesmo programa nele? Qual modificação eu preciso fazer?
Valeu!!

Álvaro- Eng. de Redes de Celular

[16] Comentário enviado por marrento em 26/07/2006 - 22:13h:

@hartax:
"pra adicionar os dados oriundos de uma variavel? como eh que faz?"

vc vai montar a string de sua query, assim:

char nome[ 80 ];
char sexo;
char sql[ 1000 ];

sprintf( sql, "insert into tabela (nome, sexo) values ('%s', '%c')", nome, sexo );

e por aí vai...


[17] Comentário enviado por hartax em 02/08/2006 - 00:55h:

um amigo meu resolveu o meu prob com as variaveis hj ai entro aqui pra ver se alguem tinha respondido e o marrento me manda o que esse meu amigo me mandou hahaha valeuz marrento!

[18] Comentário enviado por thiagou319 em 19/09/2006 - 15:32h:

compila certo!!!

fiquei maior tempo para descubrir!!!


gcc -o test progrma.c -lmysqlclient

./test

e pronto

[19] Comentário enviado por lufagovi em 02/12/2006 - 03:48h:

eu tentei compilar varias vezes, mas só me da os seguintes erros...
C:\MinGW\include\mysql\mysql_com.h:175: error: `SOCKET' does not name a type
C:\MinGW\include\mysql\mysql_com.h:339: error: `SOCKET' was not declared in this scope
C:\MinGW\include\mysql\mysql_com.h:339: error: expected primary-expression before "const"
C:\MinGW\include\mysql\mysql_com.h:339: error: expected primary-expression before "unsigned"
C:\MinGW\include\mysql\mysql_com.h:340: error: expected primary-expression before "unsigned"
C:\MinGW\include\mysql\mysql_com.h:340: error: initializer expression list treated as compound expression
:: === Build finished: 6 errors, 0 warnings ===
Será que alguem pode me ajudar?

[20] Comentário enviado por lufagovi em 02/12/2006 - 04:57h:

ops já achei... tinha que declara a windows.h ¬ ¬' antes que tudo

[21] Comentário enviado por laurosalmito em 21/12/2006 - 11:07h:

Como faço para guardar os dados do mysql em um vetor no C?

Por exemplo:
Existindo a variavel idades[n] com todas as idades que tem no banco?

[22] Comentário enviado por clarkmili em 09/07/2007 - 15:36h:

Excelente, este post foi mesmo muuuuuuuuito útil... estava a procura na net, mas os exemplos não são tão bem explicados como esse. Thanks

[23] Comentário enviado por cold_feelings em 21/08/2007 - 17:20h:

Vlwwwwwwwwwwwwww, muuuuito bom esse tutorial, isso vai para minha monografia com as devidas referências ... vlw

[24] Comentário enviado por f_Candido em 12/09/2007 - 17:28h:

Muito Bom este tutorial.
Parabéns
Abraços

[25] Comentário enviado por netmorais em 18/06/2008 - 13:48h:

Ricardo

Sou novato em MySql. Li o seu artigo achei muito bom. Testei nu Linux e correu tudo bem. Resolvi fazer um teste análogo no Windows utilizando um de seus exemplos e estou encontrando problemas. Veja a seguir:

LINUX

$ cat teste.c
#include <stdio.h>
#include <mysql/mysql.h>

main(void)
{
MYSQL conexao;

mysql_init(&conexao);
mysql_real_connect(&conexao, "localhost", "guest", "guest", "teste", 0, NULL, 0);
printf("conectado com sucesso!\n");
mysql_close(&conexao);
}

$ gcc teste.c -l mysqlclient ; mv a.out teste.exe

$ teste.exe
conectado com sucesso!


WINDOWS

com Gcc do MinGW, MySQL 5.0 e a pasta .../mysql/* em /mingw/include/mysql ocorrem os seguintes erros durante a complilação:

$ gcc teste.c -l mysqlclient

In file included from /mingw/include/mysql/mysql.h:72, from teste.c:2:
/mingw/include/mysql/mysql_com.h:183: parse error before "SOCKET"
/mingw/include/mysql/mysql_com.h:222: parse error before '}' token
/mingw/include/mysql/mysql_com.h:335: parse error before '*' token
/mingw/include/mysql/mysql_com.h:336: parse error before '*' token
/mingw/include/mysql/mysql_com.h:337: parse error before '*' token
/mingw/include/mysql/mysql_com.h:338: parse error before '*' token
/mingw/include/mysql/mysql_com.h:339: parse error before '*' token
/mingw/include/mysql/mysql_com.h:340: parse error before '*' token
.....

Você tem alguma dica para o problema?

Grato.
Sérgio.
netmorais@ig.com.br

[26] Comentário enviado por netmorais em 18/06/2008 - 16:26h:

Ricardo
Já diminuiu os erros. Usei o include sugerido "windows.h" mas continua aparecendo:
\mingw\lib\gcc-lib\mingw32\3.2.3\..\..\..\..\mingw32\bin\ld.exe: cannot find -lmysqlclient
Usei a opção -L .../MySQL/.../lib/opt, copiei o .../MySQL/.../lib/opt para mas não funciona.
Sérgio.
netmorais@ig.com.br

[27] Comentário enviado por wgaprendiz em 12/10/2008 - 23:12h:

Ola Ricardo
Muito bom seu artigo.

Bom estou com alguns problemas para executar os exemplos.

Utilizo a versão 4.9.9.2 do Dev c/c++ no win XP Pro.
Ja baixei a bilbioteca mysql.h

Ao tentar compilar os exemplos , aparecem as seguintes mensagens de erro no dev:

[Linker error] undefined reference to 'WinMain@16'
Id returned 1 exit status
C:\Dev-Cpp\Makefile.win [Build Error] [project2.exe] Error 1

Como sou novato em C não sei decifrar esses erros , mas acho que o problema possa estar na biblioteca mysql.h, pois eu baixei a primeira que encontrei e nao sei se é a mais adequada.


Alguem pode me ajudar a solucionar o problema.!?

Desde ja agradeço pela atenção.

walaceg@gmail.com


[28] Comentário enviado por abekawa em 01/04/2009 - 21:43h:

Olá Pessoal,

No linux a biblioteca libmysql pode ser instalada baixando o pacote libmysql++-dev .
Distribuições baseadas em debiam podem usar o seguinte comando.
#sudo apt-get install libmysql++-dev

Tambem deverá ser feito algumas alterações no código:

declarem a main como int, como nosso amigo lá em cima já citou.

#include <stdio.h>
#include <mysql/mysql.h>

int main(void)
{
MYSQL conexao;

mysql_init(&conexao);
if ( mysql_real_connect(&conexao, "localhost", "root", "123mudar", "agenda", 0, NULL, 0) )
{
printf("conectado com sucesso!\n");
mysql_close(&conexao);
}
else
{
printf("Falha de conexao\n");
printf("Erro %d : %s\n", mysql_errno(&conexao), mysql_error(&conexao));
}
}


[29] Comentário enviado por abekawa em 02/04/2009 - 00:00h:

PERGUNTA, como inserir o valor de uma variavel qualquer no insert into.... mais ou menos isso

#include <stdio.h>
#include <mysql/mysql.h>

int main(void)
{
MYSQL conexao;
int res;
char nome[50], telefone[10];

scanf("%s", &nome);
scanf("%s", &telefone);



mysql_init(&conexao);
if ( mysql_real_connect(&conexao, "localhost", "root", "123mudar", "agenda", 0, NULL, 0) )
{
printf("conectado com sucesso!\n");


res = mysql_query(&conexao,"INSERT INTO cadastro(nome, telefone) values (" + nome + "," + telefone + ");");


if (!res) printf("Registros inseridos %d\n", mysql_affected_rows(&conexao));
else printf("Erro na inserção %d : %s\n", mysql_errno(&conexao), mysql_error(&conexao));

mysql_close(&conexao);
}
else
{
printf("Falha de conexao\n");
printf("Erro %d : %s\n", mysql_errno(&conexao), mysql_error(&conexao));
}
}

[30] Comentário enviado por netmorais em 17/06/2009 - 10:47h:

Ricardo
Usei o modelo do seu artigo para construir um executavel tanto no Linux, como no Windows (.exe, infelizmente preciso) para estabelecer a conexão a baixo custo de outras linguagens com o Mysql e funciona muito bem. A biblioteca que uso na compilação com o gcc é a libmysqlclient.a que vem junto com a distribuição do Mysql.
Atualmente, no caso do Windows, estou tentando melhorar a performance da interface criando uma Dll. Para isso transformei o programa em C em um conjunto de "funções" para conexão, execução de sqls e desconexão com banco. Aplicação que "chama" as funções é pre-compilada em um .obj, assim como as "funções" que acessam o banco com "gcc -c funcoes.c -o funcoes.obj". (não posso "linkar" o Mysql nesse momento). Após isso executo o Link (da MS) "link ... -d aplicacao.obj funcoes.obj libmysqlclient.a" que cria a Dll e naõ aponta nenhum erro. Porém na execução aborta logo no "mysql_init".
A biblioteca "libmysqlcliente.a" utilizada não é apropriada para este caso? Existe "mysqlclient.obj"?
Grato
Sérgio.

[31] Comentário enviado por fmj1988 em 31/10/2009 - 18:43h:


Felipe
estou tentando inserir aki mas estou com duvidas.

como eu faço pra inserir dinamicamente.
ex
int i=0;
char b[][]={"rebeca","precila","barbara"};
for (i=0;i<3;i++){

mysql_query(&con,"insert into aprendendo(nome) values ('%s');",b[][i]);
}

como eu faria isso???

agradeço desde já

[32] Comentário enviado por walquiriosaraiva em 20/11/2009 - 06:54h:

Bom dia pessoal!!

Estou com um problema em C, não consigo encontrar a biblioteca para conexão com banco de dados. Não sei onde baixar, já tentei encontrar mais as que achei não funciona quando eu tento compilar o programa ele dá um erro e pelo que percebi deve ser na biblioteca.

#include <stdio.h>
#include <mysql/mysql.h>
#include <conio.h>

void main(void)
{
MYSQL conexao;

mysql_init(&conexao);
mysql_real_connect(&conexao, "localhost", "root", "root", "teste", 0, NULL, 0);
printf("conectado com sucesso!\n");
mysql_close(&conexao);
}

Se puder me enviar um email é melhor...
walquiriosaraiva@gmail.com

Att,
Walquirio Saraiva Rocha


[33] Comentário enviado por Raios em 16/04/2010 - 15:56h:

Olá pessoal bem a conexão foi realizada com sucesso só que na hora de eu transformar isso tudo para DLL, gera um erro na conexão, bem esse é meu código porém não consigo criar uma DLL com banco. Gostaria que me ajudasse.


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <mysql/mysql.h>
#include <string.h>

int main(void)
{
MYSQL conexao;
MYSQL_RES *resp;
MYSQL_ROW linhas;
MYSQL_FIELD *campos;
char query[]="SELECT * FROM cliente;";
int conta; //Contador comum

mysql_init(&conexao);
if (mysql_real_connect(&conexao,"localhost","user","user","dados",0,NULL,0))
{
printf("Conectado com Sucesso!\n");
if (mysql_query(&conexao,query))
printf("Erro: %s\n",mysql_error(&conexao));
else
{
resp = mysql_store_result(&conexao);//recebe a consulta
if (resp) //se houver consulta
{
//passa os dados dos campos para a vari·vel campos
//escreve na tela os nomes dos campos dando
//um tab somente
campos = mysql_fetch_fields(resp);
for (conta=0;conta<mysql_num_fields(resp);conta++) {
printf("%s",(campos[conta]).name);
if (mysql_num_fields(resp)>1)
printf("\t");
}

printf("\n");

//enquanto retonrnar registros, conta atÈ o
//n&#729;mero de colunas que a tabela tem e escreve na
//tela com um tab, depois pula a linha e tenta
//pegar outro registro
while ((linhas=mysql_fetch_row(resp)) != NULL)
{
for (conta=0;conta<mysql_num_fields(resp);conta++)
printf("%s\t",linhas[conta]);
printf("\n");
}
}
mysql_free_result(resp);//limpa a vari·vel do resultado: resp
}
mysql_close(&conexao);
}
else
{
printf("Conexao Falhou\n");
if (mysql_errno(&conexao))
printf("Erro %d : %s\n", mysql_errno(&conexao), mysql_error(&conexao));
}
system("pause");
return 0;
}


[34] Comentário enviado por wcoutinho em 22/04/2010 - 01:56h:

muito bom o post.

eu to com uma serie de problemas na compilacao.

gcc mysql-connect.c -lmysqlclient

mysql-connect.c:2:24: error: mysql/mysql.h: No such file or directory
mysql-connect.c: In function ‘main’:
mysql-connect.c:11: error: ‘MYSQL’ undeclared (first use in this function)
mysql-connect.c:11: error: (Each undeclared identifier is reported only once
mysql-connect.c:11: error: for each function it appears in.)
mysql-connect.c:11: error: expected ‘;’ before ‘conexao’
mysql-connect.c:12: error: ‘MYSQL_RES’ undeclared (first use in this function)
mysql-connect.c:12: error: ‘resp’ undeclared (first use in this function)
mysql-connect.c:13: error: ‘MYSQL_ROW’ undeclared (first use in this function)
mysql-connect.c:13: error: expected ‘;’ before ‘linhas’
mysql-connect.c:14: error: ‘MYSQL_FIELD’ undeclared (first use in this function)
mysql-connect.c:14: error: ‘campos’ undeclared (first use in this function)
mysql-connect.c:18: error: ‘conexao’ undeclared (first use in this function)
mysql-connect.c:23: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’
mysql-connect.c:45: error: ‘linhas’ undeclared (first use in this function)
mysql-connect.c:60: warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘int’


alguem pode me ajudar?



[35] Comentário enviado por icekill em 03/06/2010 - 01:42h:

Seu problema na compilação é que faltam as bibliotecas ou o mysql-devel não encontra-se instalado.

Recomendo compilar usando a seguinte sintaxe:
gcc `mysql_config --cflags --include --libs` teste-mysql.c -o teste-mysql.c


[36] Comentário enviado por williandiniz em 03/07/2010 - 16:00h:

resposta ao [7] Comentário enviado por jllucca em 30/08/2004 - 13:43h:
Complementado:
int res;
int data=999;
int lat=1000;
char* query[100];
sprintf(query,"INSERT INTO dados_teste (ID,lati) values ('%d','%d');",data,lat);
.
.
.
res = mysql_query(&conexao,query);

dados_teste = nome da tabela
ID e lati são os campos da tabela
data e lat são as variaveis.

[37] Comentário enviado por graantonucci em 18/10/2010 - 00:33h:

Estou fazendo a conexao mysql em C++

como faço para o insert aceitar as variaveis char dt_dia_trabalhado e hr_entrada?

//sock
int res;
MYSQL *sock;
sock = mysql_init(0);

if (sock) cout << "sock handle ok!" << endl;
else {
cout << "sock handle failed!" << mysql_error(sock) << endl;
}

//connection
if (mysql_real_connect(sock, host, user, pass, db, 0, NULL, 0)) {
cout << "connection ok!" << endl;
res = mysql_query(sock,"INSERT INTO cadastro_horas(dt_dia_trabalhado, hr_entrada ) values (dt_dia_trabalhado, hr_entrada );");

Coloquei assim, mas insere como Null. oq eu faço?


Contribuir com comentário


  
Para executar esta ação você precisa estar logado no site, caso contrário, tudo o que for digitado será perdido.
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.