使用的系统是Ubuntu 11.10.数据库是MySQL。
MySQL数据库环境配置
首先需要安装mysql客户端和服务器,命令行安装方式为:
[cpp] view plain copy
1. sudo apt-get install mysql-server mysql-client
然后,要使用C语言编程访问数据库,需要另外安装一个开发包:
[cpp] view plain copy
- sudo apt-get install libmysqlclient15-dev

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

然后创建一个名为foo的数据库:
[cpp] view plain copy
1. CREATE DATABASE foo;
然后利用如下SQL语句创建表及插入数据:
[cpp] view plain copy
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命令行模式中执行方法如下:

MySQL数据库连接测试
[cpp] view plain copy
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. }
执行结果:

注意的是:需要指定include库和库文件的路径名,以及指定链接的库模块mysqlclient。
如果不在开始的时候安装开发包,就会产生如下错误:

执行SQL语句进行数据操作
向数据库表children中插入一行:
[cpp] view plain copy
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. }运行结果:


在这里特别需要注意的是:
函数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);
















