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/8041794
1
2.3连接到数据库
在数据库和表建好以后,编写如下代码,测试是否能连接上该数据库:
#include<stdlib.h>
#include<stdio.h>
#include<mysql/mysql.h>
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!\n");
return -1;
}
ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);//设置超时选项
if(ret)
{
printf("Options Set ERRO!\n");
}
conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);//连接MySQL testdb数据库
if(conn_ptr)
{
printf("Connection Succeed!\n");
mysql_close(conn_ptr);
printf("Connection closed!\n");
}
else //错误处理
{
printf("Connection Failed!\n");
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
}
return -2;
}
return 0;
}
代码编译后,出现如下显示则表明连接至MySQL数据库成功:
2.4输入数据到表
测试连接成功后,使用mysql_query函数在数据库的表中插入数据,本例中,插入(ann,3)数据至表,代码如下:
#include<stdlib.h>
#include<stdio.h>
#include<mysql/mysql.h>
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!\n");
return -1;
}
ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);//设置超时选项
if(ret)
{
printf("Options Set ERRO!\n");
}
conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);//连接MySQL testdb数据库
if(conn_ptr)
{
printf("Connection Succeed!\n");
ret = mysql_query(conn_ptr,"INSERT INTO children(fname,age) VALUES('ann',3)"); //执行SQL语句
if(!ret)
{
printf("Inserted %lu rows\n",(unsigned long)mysql_affected_rows(conn_ptr));//返回上次UPDATE更改行数
}
else
{
printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
}
mysql_close(conn_ptr);
printf("Connection closed!\n");
}
else //错误处理
{
printf("Connection Failed!\n");
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
}
return -2;
}
return 0;
}
编译代码:
对比执行代码前后的数据库状态:
2.5检索数据库表中数据
连接到数据库后,可以进行数据检索工作,数据检索可以使用mysql_store_result或mysql_use_result,取决于怎样检索数据,其次使用mysql_fetch_row来处理数据。最后,使用mysql_free_result允许MySQL进行必要的整理工作。本例中,要测试的数据库中表有三条记录数据。
2.5.1使用mysql_store_result方法检索
代码如下:
#include<stdlib.h>
#include<stdio.h>
#include<mysql/mysql.h>
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!\n");
return -1;
}
ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);//设置超时选项
if(ret)
{
printf("Options Set ERRO!\n");
}
conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);//连接MySQL testdb数据库
if(conn_ptr)
{
printf("Connection Succeed!\n");
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\n",(unsigned long)mysql_num_rows(res_ptr));//在结果集合中返回行的数量
while((sqlrow = mysql_fetch_row(res_ptr)))//返回store_result中得到的结构体,并从中检索单行
{
printf("Fetched data\n");
}
}
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
return -2;
}
mysql_free_result(res_ptr);
}
else
{
printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
return -3;
}
mysql_close(conn_ptr);
printf("Connection closed!\n");
}
else //错误处理
{
printf("Connection Failed!\n");
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
}
return -2;
}
return 0;
}
编译及运行:
2.5.2使用mysql_use_result方法检索
#include<stdlib.h>
#include<stdio.h>
#include<mysql/mysql.h>
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!\n");
return -1;
}
ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);//设置超时选项
if(ret)
{
printf("Options Set ERRO!\n");
}
conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);//连接MySQL testdb数据库
if(conn_ptr)
{
printf("Connection Succeed!\n");
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\n",(unsigned long)mysql_num_rows(res_ptr));//在结果集合中返回行的数量
while((sqlrow = mysql_fetch_row(res_ptr)))//返回store_result中得到的结构体,并从中检索单行
{
printf("Fetched data\n");
}
}
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
return -2;
}
mysql_free_result(res_ptr);
}
else
{
printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
return -3;
}
mysql_close(conn_ptr);
printf("Connection closed!\n");
}
else //错误处理
{
printf("Connection Failed!\n");
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
}
return -2;
}
return 0;
}
编译及运行:
2.6处理检索数据
在得到检索数据后,应该进行检索数据处理工作,本例中,将检索出来的数据打印出来:
#include<stdlib.h>
#include<stdio.h>
#include<mysql/mysql.h>
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<mysql_field_count(ptr))
{
printf("%s",sqlrow[field_count]);
field_count++;
}
printf("\n");
}
int main()
{
int ret = 0;
conn_ptr = mysql_init(NULL);//初始化
if(!conn_ptr)
{
printf("mysql_init failed!\n");
return -1;
}
ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);//设置超时选项
if(ret)
{
printf("Options Set ERRO!\n");
}
conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);//连接MySQL testdb数据库
if(conn_ptr)
{
printf("Connection Succeed!\n");
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\n",(unsigned long)mysql_num_rows(res_ptr));//在结果集合中返回行的数量
while((sqlrow = mysql_fetch_row(res_ptr)))//返回store_result中得到的结构体,并从中检索单行
{
printf("Fetched data\n");
dispaly_row(conn_ptr);
}
}
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
return -2;
}
mysql_free_result(res_ptr);
}
else
{
printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
return -3;
}
mysql_close(conn_ptr);
printf("Connection closed!\n");
}
else //错误处理
{
printf("Connection Failed!\n");
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
}
return -2;
}
return 0;
}
编译及运行结果:
上例中没有考虑在结果中可能出现的NULL值,若要在一个更加结构化的表单中得到数据及关于数据信息,使用mysql_fetch_field函数实现:
#include<stdlib.h>
#include<stdio.h>
#include<mysql/mysql.h>
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<mysql_field_count(ptr)) //返回在结果结合中字段的数目
{
printf("%s",sqlrow[field_count]);
field_count++;
}
printf("\n");
}
void display_header()
{
MYSQL_FIELD *field_ptr;
printf("Column details:\n");
while((field_ptr = mysql_fetch_field(res_ptr))!= NULL)//返回列的定义字段信息
{
printf("\t Name:%s\n",field_ptr->name);
printf("\t Type:");
if(IS_NUM(field_ptr->type))//若字段类型为数字
{
printf("Numeric field\n");
}
else
{
switch(field_ptr->type)
{
case FIELD_TYPE_VAR_STRING:
printf("VACHAR\n");
break;
case FIELD_TYPE_LONG:
printf("LONG\n");
break;
default:
printf("Type is %d,check in mysql_com.h\n",field_ptr->type);
}
}
printf("\t Max width %ld \n",field_ptr->length);
if(field_ptr->flags & AUTO_INCREMENT_FLAG)
printf("\t Auto increments\n");
printf("\n");
}
}
int main()
{
int ret = 0;
int first_row = 1;
conn_ptr = mysql_init(NULL);//初始化
if(!conn_ptr)
{
printf("mysql_init failed!\n");
return -1;
}
ret = mysql_options(conn_ptr,MYSQL_OPT_CONNECT_TIMEOUT,(const char*)&timeout);//设置超时选项
if(ret)
{
printf("Options Set ERRO!\n");
}
conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","aabbcc","testdb",0,NULL,0);//连接MySQL testdb数据库
if(conn_ptr)
{
printf("Connection Succeed!\n");
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\n",(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\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
return -2;
}
mysql_free_result(res_ptr);
}
else
{
printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
return -3;
}
mysql_close(conn_ptr);
printf("Connection closed!\n");
}
else //错误处理
{
printf("Connection Failed!\n");
if(mysql_errno(conn_ptr))
{
printf("Connect Erro:%d %s\n",mysql_errno(conn_ptr),mysql_error(conn_ptr));//返回错误代码、错误消息
}
return -2;
}
return 0;
}
编译及运行结果:
以上。
参考资料:
刘学勇.Linux C编程从入门到精通[M].北京,电子工业出版社,2014.1.