Linux下使用C语言访问MySQL数据库(三):访问实现代码

2019-07-13 09:04发布

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; //超时时间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);//连接MySQL testdb数据库 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; //超时时间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);//连接MySQL testdb数据库 if(conn_ptr) { printf("Connection Succeed! "); ret = mysql_query(conn_ptr,"INSERT INTO children(fname,age) VALUES('ann',3)"); //执行SQL语句 if(!ret) { printf("Inserted %lu rows ",(unsigned long)mysql_affected_rows(conn_ptr));//返回上次UPDATE更改行数 } 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; //超时时间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);//连接MySQL testdb数据库 if(conn_ptr) { printf("Connection Succeed! "); ret = mysql_query(conn_ptr,"SELECT childno,fname,age FROM children WHERE age > 5"); //执行SQL语句,查找大于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)))//返回store_result中得到的结构体,并从中检索单行 { 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; //超时时间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);//连接MySQL testdb数据库 if(conn_ptr) { printf("Connection Succeed! "); ret = mysql_query(conn_ptr,"SELECT childno,fname,age FROM children WHERE age > 5"); //执行SQL语句,查找大于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)))//返回store_result中得到的结构体,并从中检索单行 { 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; //超时时间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);//连接MySQL testdb数据库 if(conn_ptr) { printf("Connection Succeed! "); ret = mysql_query(conn_ptr,"SELECT childno,fname,age FROM children WHERE age > 5"); //执行SQL语句,查找大于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)))//返回store_result中得到的结构体,并从中检索单行 { 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; //超时时间7秒 void dispaly_row(MYSQL *ptr) { unsigned int field_count = 0; while(field_count//返回在结果结合中字段的数目 { printf("%s",sqlrow[field_count]); field_count++; } printf(" "); } void display_header() { MYSQL_FIELD *field_ptr; printf("Column details: "); while((field_ptr = mysql_fetch_field(res_ptr))!= NULL)//返回列的定义字段信息 { printf(" Name:%s ",field_ptr->name); printf(" Type:"); if(IS_NUM(field_ptr->type))//若字段类型为数字 { printf("Numeric field "); } else { switch(field_ptr->type) { case FIELD_TYPE_VAR_STRING: printf("VACHAR "); break; case FIELD_TYPE_LONG: printf("LONG "); break; default: printf("Type is %d,check in mysql_com.h ",field_ptr->type); } } printf(" Max width %ld ",field_ptr->length); if(field_ptr->flags & AUTO_INCREMENT_FLAG) printf(" Auto increments "); printf(" "); } } int main() { int ret = 0; int first_row = 1; 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);//连接MySQL testdb数据库 if(conn_ptr) { printf("Connection Succeed! "); ret = mysql_query(conn_ptr,"SELECT childno,fname,age FROM children WHERE age > 5"); //执行SQL语句,查找大于5岁的孩子 if(!ret) { res_ptr = mysql_use_result(conn_ptr); if(res_ptr) { display_header(); printf("Retrieved %lu rows ",(unsigned long)mysql_num_rows(res_ptr));//在结果集合中返回行的数量 while((sqlrow = mysql_fetch_row(res_ptr)))//返回store_result中得到的结构体,并从中检索单行 { 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; } 编译及运行结果:
这里写图片描述
以上。
参考资料:
刘学勇.Linux C编程从入门到精通[M].北京,电子工业出版社,2014.1.