使用的系统是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  


c语言代码调用sqlite3数据库 c语言怎么连接sql数据库_c语言代码调用sqlite3数据库

在MySQL中建立相应数据库

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


c语言代码调用sqlite3数据库 c语言怎么连接sql数据库_c语言代码调用sqlite3数据库_02

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


[cpp]  view plain  copy


 print

?


1. CREATE DATABASE foo;

然后利用如下SQL语句创建表及插入数据:


[cpp]  view plain  copy


 print

?


1. CREATE TABLE children(  
2. int(11) NOT NULL auto_increment,  
3.     fname varchar(30),  
4. 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命令行模式中执行方法如下:


c语言代码调用sqlite3数据库 c语言怎么连接sql数据库_c语言代码调用sqlite3数据库_03

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. "mysql_init failed\n");  
14. return EXIT_FAILURE;  
15.   }  
16.   
17. "localhost","rick","rick","foo",0,NULL,0);  
18.   
19. if(conn_ptr)  
20. "Connection success\n");  
21. else  
22. "Connection failed\n");  
23.   
24.   mysql_close(conn_ptr);  
25.   
26. return EXIT_SUCCESS;  
27. }


执行结果:


c语言代码调用sqlite3数据库 c语言怎么连接sql数据库_c语言_04

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

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


c语言代码调用sqlite3数据库 c语言怎么连接sql数据库_c语言代码调用sqlite3数据库_05

执行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. "Connection success\n");  
    16.   
    17. //执行SQL语句  
    18. "INSERT INTO children(fname,age) VALUES('Ann',3)");  
    19.   
    20. if(!res)  
    21. "Inserted %lu rows\n",(unsigned long)mysql_affected_rows(&my_connecyion));  
    22. else  
    23. "Insert error %d : %s \n",mysql_errno(&my_connecyion),mysql_error(&my_connecyion));  
    24.   
    25.     mysql_close(&my_connecyion);  
    26.   }  
    27. else{  
    28. "Connection failed\n");  
    29. if(mysql_errno(&my_connecyion))  
    30. "Connection error %d : %s\n",mysql_errno(&my_connecyion),mysql_error(&my_connecyion));  
    31.   }  
    32.   
    33. return EXIT_SUCCESS;  
    34. }

    运行结果:


    c语言代码调用sqlite3数据库 c语言怎么连接sql数据库_mysql_06


    c语言代码调用sqlite3数据库 c语言怎么连接sql数据库_c语言_07

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

    函数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);