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

  • Post author:
  • Post category:linux




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.



版权声明:本文为wangqingchuan92原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。