1.前言
1.1声明
文章中的文字可能存在语法错语以及标点错误,请谅解;
如果在文章中发现代码错误或其它问题请告知,感谢!
关于数据库的基本概念和MySQL数据库的安装可以参看我这篇文章:
https://blog.csdn.net/wangqingchuan92/article/details/80404275
2.代码实现
2.1下载MySQL库
在使用C语言开发访问数据库代码之前,需要下载MySQL开发库:
在终端输入指令:
sudo apt-get install libmysqlclient15-dev

完成安装后,在/usr/include/mysql中含有使用C语言操作MySQL所需要的头文件库:mysql.h。
2.2建立一个测试用数据库
本例中,新建一个名为“testdb”的数据库,数据库中新建一个名为“children”的表,表的内容包括编号、儿童姓名、年龄:

具体关于创建一个数据库可以参看这篇文章:
https://blog.csdn.net/wangqingchuan92/article/details/80417941
2.3连接到数据库
在数据库和表建好以后,编写如下代码,测试是否能连接上该数据库:
#include
#include
#include
MYSQL *conn_ptr;
unsigned int timeout = 7;
int main()
{
int ret = 0;
conn_ptr = mysql_init(NULL);
if(!conn_ptr)
{
printf("mysql_init failed!
");
return -1;
}
ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);
if(ret)
{
printf("Options Set ERRO!
");
}
conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);
if(conn_ptr)
{
printf("Connection Succeed!
");
mysql_close(conn_ptr);
printf("Connection closed!
");
}
else
{
printf("Connection Failed!
");
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s
",mysql_errno(conn_ptr),mysql_error(conn_ptr));
}
return -2;
}
return 0;
}
代码编译后,出现如下显示则表明连接至MySQL数据库成功:
2.4输入数据到表
测试连接成功后,使用mysql_query函数在数据库的表中插入数据,本例中,插入(ann,3)数据至表,代码如下:
#include
#include
#include
MYSQL *conn_ptr;
unsigned int timeout = 7;
int main()
{
int ret = 0;
conn_ptr = mysql_init(NULL);
if(!conn_ptr)
{
printf("mysql_init failed!
");
return -1;
}
ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);
if(ret)
{
printf("Options Set ERRO!
");
}
conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);
if(conn_ptr)
{
printf("Connection Succeed!
");
ret = mysql_query(conn_ptr,"INSERT INTO children(fname,age) VALUES('ann',3)");
if(!ret)
{
printf("Inserted %lu rows
",(unsigned long)mysql_affected_rows(conn_ptr));
}
else
{
printf("Connect Erro:%d %s
",mysql_errno(conn_ptr),mysql_error(conn_ptr));
}
mysql_close(conn_ptr);
printf("Connection closed!
");
}
else
{
printf("Connection Failed!
");
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s
",mysql_errno(conn_ptr),mysql_error(conn_ptr));
}
return -2;
}
return 0;
}
编译代码:
对比执行代码前后的数据库状态:
2.4检索数据库表中数据
连接到数据库后,可以进行数据检索工作,数据检索可以使用mysql_store_result或mysql_use_result,取决于怎样检索数据,其次使用mysql_fetch_row来处理数据。最后,使用mysql_free_result允许MySQL进行必要的整理工作。本例中,要测试的数据库中表有三条记录数据。
2.4.1使用mysql_store_result方法检索
代码如下:
#include
#include
#include
MYSQL *conn_ptr;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
unsigned int timeout = 7;
int main()
{
int ret = 0;
conn_ptr = mysql_init(NULL);
if(!conn_ptr)
{
printf("mysql_init failed!
");
return -1;
}
ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);
if(ret)
{
printf("Options Set ERRO!
");
}
conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);
if(conn_ptr)
{
printf("Connection Succeed!
");
ret = mysql_query(conn_ptr,"SELECT childno,fname,age FROM children WHERE age > 5");
if(!ret)
{
res_ptr = mysql_store_result(conn_ptr);
if(res_ptr)
{
printf("Retrieved %lu rows
",(unsigned long)mysql_num_rows(res_ptr));
while((sqlrow = mysql_fetch_row(res_ptr)))
{
printf("Fetched data
");
}
}
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s
",mysql_errno(conn_ptr),mysql_error(conn_ptr));
return -2;
}
mysql_free_result(res_ptr);
}
else
{
printf("Connect Erro:%d %s
",mysql_errno(conn_ptr),mysql_error(conn_ptr));
return -3;
}
mysql_close(conn_ptr);
printf("Connection closed!
");
}
else
{
printf("Connection Failed!
");
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s
",mysql_errno(conn_ptr),mysql_error(conn_ptr));
}
return -2;
}
return 0;
}
编译及运行:
2.4.2使用mysql_use_result方法检索
#include
#include
#include
MYSQL *conn_ptr;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
unsigned int timeout = 7;
int main()
{
int ret = 0;
conn_ptr = mysql_init(NULL);
if(!conn_ptr)
{
printf("mysql_init failed!
");
return -1;
}
ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);
if(ret)
{
printf("Options Set ERRO!
");
}
conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);
if(conn_ptr)
{
printf("Connection Succeed!
");
ret = mysql_query(conn_ptr,"SELECT childno,fname,age FROM children WHERE age > 5");
if(!ret)
{
res_ptr = mysql_use_result(conn_ptr);
if(res_ptr)
{
printf("Retrieved %lu rows
",(unsigned long)mysql_num_rows(res_ptr));
while((sqlrow = mysql_fetch_row(res_ptr)))
{
printf("Fetched data
");
}
}
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s
",mysql_errno(conn_ptr),mysql_error(conn_ptr));
return -2;
}
mysql_free_result(res_ptr);
}
else
{
printf("Connect Erro:%d %s
",mysql_errno(conn_ptr),mysql_error(conn_ptr));
return -3;
}
mysql_close(conn_ptr);
printf("Connection closed!
");
}
else
{
printf("Connection Failed!
");
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s
",mysql_errno(conn_ptr),mysql_error(conn_ptr));
}
return -2;
}
return 0;
}
编译及运行:
2.5处理检索数据
在得到检索数据后,应该进行检索数据处理工作,本例中,将检索出来的数据打印出来:
#include
#include
#include
MYSQL *conn_ptr;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
unsigned int timeout = 7;
void dispaly_row(MYSQL *ptr)
{
unsigned int field_count = 0;
while(field_countprintf("%s",sqlrow[field_count]);
field_count++;
}
printf("
");
}
int main()
{
int ret = 0;
conn_ptr = mysql_init(NULL);
if(!conn_ptr)
{
printf("mysql_init failed!
");
return -1;
}
ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);
if(ret)
{
printf("Options Set ERRO!
");
}
conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);
if(conn_ptr)
{
printf("Connection Succeed!
");
ret = mysql_query(conn_ptr,"SELECT childno,fname,age FROM children WHERE age > 5");
if(!ret)
{
res_ptr = mysql_use_result(conn_ptr);
if(res_ptr)
{
printf("Retrieved %lu rows
",(unsigned long)mysql_num_rows(res_ptr));
while((sqlrow = mysql_fetch_row(res_ptr)))
{
printf("Fetched data
");
dispaly_row(conn_ptr);
}
}
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s
",mysql_errno(conn_ptr),mysql_error(conn_ptr));
return -2;
}
mysql_free_result(res_ptr);
}
else
{
printf("Connect Erro:%d %s
",mysql_errno(conn_ptr),mysql_error(conn_ptr));
return -3;
}
mysql_close(conn_ptr);
printf("Connection closed!
");
}
else
{
printf("Connection Failed!
");
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s
",mysql_errno(conn_ptr),mysql_error(conn_ptr));
}
return -2;
}
return 0;
}
编译及运行结果:
上例中没有考虑在结果中可能出现的NULL值,若要在一个更加结构化的表单中得到数据及关于数据信息,使用mysql_fetch_field函数实现:
#include
#include
#include
MYSQL *conn_ptr;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;
unsigned int timeout = 7;
void dispaly_row(MYSQL *ptr)
{
unsigned int field_count = 0;
while(field_count
编译及运行结果:
以上。
参考资料:
刘学勇.Linux C编程从入门到精通[M].北京,电子工业出版社,2014.1.