【Linux】Ubuntu下C语言访问MySQL数据库入门

使用的系统是Ubuntu 11.10.数据库MySQL


MySQL数据库环境配置


首先需要安装mysql客户端和服务器,命令行安装方式为:

[cpp]  view plain  copy
 print ?
  1. sudo apt-get install mysql-server mysql-client  

然后,要使用C语言编程访问数据库,需要另外安装一个开发包:

[cpp]  view plain  copy
 print ?
  1. sudo apt-get install libmysqlclient15-dev  


在MySQL中建立相应数据库

首先以用户rick登录MySQL数据库(用户rick已经被root权限用户赋予了创建数据库等等的权限):


然后创建一个名为foo的数据库:

[cpp]  view plain  copy
 print ?
  1. CREATE DATABASE foo;  
然后利用如下SQL语句创建表及插入数据:

[cpp]  view plain  copy
 print ?
  1. CREATE TABLE children(  
  2.     childno int(11) NOT NULL auto_increment,  
  3.     fname varchar(30),  
  4.     age int(11),  
  5.     PRIMARY KEY (childno)  
  6.     );  
  7.   
  8. INSERT INTO children(childno,fname,age) VALUES(1,'Jenny',21);  
  9. INSERT INTO children(childno,fname,age) VALUES(2,'Andrew',17);  
  10. INSERT INTO children(childno,fname,age) VALUES(3,'Gavin',8);  
  11. INSERT INTO children(childno,fname,age) VALUES(4,'Duncan',6);  
  12. INSERT INTO children(childno,fname,age) VALUES(5,'Emma',4);  
  13. INSERT INTO children(childno,fname,age) VALUES(6,'Alex',15);  
  14. INSERT INTO children(childno,fname,age) VALUES(7,'Adrian',9);  

在MySQL命令行模式中执行方法如下:


MySQL数据库连接测试


然后采用如下C语言进行数据库连接测试connect1.c:

[cpp]  view plain  copy
 print ?
  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3.   
  4. #include "mysql.h"  
  5.   
  6. int main(int argc,char *argv[])  
  7. {  
  8.   MYSQL *conn_ptr;  
  9.   conn_ptr = mysql_init(NULL);  
  10.   
  11.   if(!conn_ptr)  
  12.   {  
  13.     fprintf(stderr,"mysql_init failed\n");  
  14.     return EXIT_FAILURE;  
  15.   }  
  16.   
  17.   conn_ptr = mysql_real_connect(conn_ptr,"localhost","rick","rick","foo",0,NULL,0);  
  18.   
  19.   if(conn_ptr)  
  20.     printf("Connection success\n");  
  21.   else  
  22.     printf("Connection failed\n");  
  23.   
  24.   mysql_close(conn_ptr);  
  25.   
  26.   return EXIT_SUCCESS;  
  27. }  
执行结果:

注意的是:需要指定include库和库文件的路径名,以及指定链接的库模块mysqlclient。

如果不在开始的时候安装开发包,就会产生如下错误:


执行SQL语句进行数据操作

向数据库表children中插入一行:

[cpp]  view plain  copy
 print ?
  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3.   
  4. #include "mysql.h"  
  5.   
  6. int main()  
  7. {  
  8.   MYSQL my_connecyion;  
  9.   int res;  
  10.   
  11.   mysql_init(&my_connecyion);  
  12.   
  13.   if(mysql_real_connect(&my_connecyion,"localhost","rick","rick","foo",0,NULL,0))  
  14.   {  
  15.     printf("Connection success\n");  
  16.   
  17.     //执行SQL语句  
  18.     res = mysql_query(&my_connecyion,"INSERT INTO children(fname,age) VALUES('Ann',3)");  
  19.   
  20.     if(!res)  
  21.       printf("Inserted %lu rows\n",(unsigned long)mysql_affected_rows(&my_connecyion));  
  22.     else  
  23.       fprintf(stderr,"Insert error %d : %s \n",mysql_errno(&my_connecyion),mysql_error(&my_connecyion));  
  24.   
  25.     mysql_close(&my_connecyion);  
  26.   }  
  27.   else{  
  28.     fprintf(stderr,"Connection failed\n");  
  29.     if(mysql_errno(&my_connecyion))  
  30.       fprintf(stderr,"Connection error %d : %s\n",mysql_errno(&my_connecyion),mysql_error(&my_connecyion));  
  31.   }  
  32.   
  33.   return EXIT_SUCCESS;  
  34. }  

运行结果:




在这里特别需要注意的是:

函数mysql_affected_rows返回的是被一个更新操作修改的行数,而不是满足where子句的行数。


关于C语言操作数据库获取结果集

代码不是拿来运行的,主要记载如何获取查询的数据库资源,MySQL *conn代表已经连接的数据库套接字(就是链接数据库的,我也不知道叫什么就叫套接字了)

MYSQL_RES *res;
MYSQL_ROW row;
mysql_init(&mysql);
char *sql="select from test";
mysql_real_query(conn,sql,,strlen(sql));
res = mysql_store_result(conn);
MYSQL_ROW row = mysql_fetch_row(res);
那么接下来进行解释
res->filed_count代表的是有多少个不同的属性,也就是列数,比如说test表中只有学号,姓名,那么res->filed_count的值就是2,如果只有学号那就是1

res->row_count代表的是多少个不同的行数,也就是有多少个数据
可以通过fes->fields[iCol].name打印字段名字

row = mysql_fetch_row(res)一次获取一行的数据放到row中
打印所有数据如下所示
   while( (row = mysql_fetch_row(res)) )
        {          
            //遍历字段
            for(int i=0 ; i <  res->field_count; i++)  
            {
                //打印字段值
                //在这里可以赋值给其它变量
                printf("%-10s ",row[i]);
            }    
            printf("\n");
        }      
        //释放,不要忘记
        mysql_free_result(res); 


//获取一行中每个字段长度
unsigned long* row_len;
row_len = mysql_fetch_lengths(res);

 
 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值