利用C语言访问mysql
- 一、相关头文件以及函数:
- 1、连接数据库使用的头文件和库文件
- 2、初始化连接句柄
- 3、连接数据库
- 4、关闭连接
- 5、提取结果
- 6、获取结果集的行数
- 7、取出结果集中的一行记录
- 8、查看记录行的列数
- 9、释放结果集占用的内存
- 10、获取错误信息
- 二、程序示例
- 1、对数据库的表进行增删改操作,并不需要程序返回相应的结果:
- 2、执行select查询语句的时候,需要程序将数据表中查询的语句返回
一、相关头文件以及函数:
1、连接数据库使用的头文件和库文件
#inlcude <mysql/mysql.h>
程序中使用访问mysql的有关函数接口,需要在连接时指定库名:
例如编译链接的时候指令如下:
gcc -o main mian.c -lmysqlclient
2、初始化连接句柄
该方法用来初始化一个连接句柄。
①如果参数为空,则返回一个指向新分配的连接句柄的指针。示例如下:
MYSQL * mysql=mysql_init(NULL);
②如果传递一个已有的结构,它将被重新初始化。
MYSQL * mysql_init(MYSQL * mysql);
出错时返回NULL
3、连接数据库
MYSQL * mysql_real_connect(MYSQL * mysql,const char* host,const char* user,const char* password,const char* db,unsigned int port,const char* unix_socket,unsigned long clientflag);
参数介绍:
mysql:上一步mysql_init()初始化返回的指针。
host:主机名(连接的服务器的IP地址)本地可以使用"localhost"或"127.0.0.1"或NULL。
user:用户名。
password:用户密码。
db:数据库的名字。
port:数据库的端口3306,也可以填写0,意味着使用mysql的默认端口3306。
unix_socket:一般为NULL,表示不适用unix套接字或者管道。
clientflag:标志位,一般给0。
4、关闭连接
void mysql_close(MYSQL* mysql);
5、提取结果
MYSQL_RES *mysql_store_result(MYSQL* mysql);//一次性提取所有数据
MYSQL_RES *mysql_use_result(MYSQL* mysql);//依次提取一行数据
该方法可以保存客户端中接收到的所有数据
6、获取结果集的行数
uint6_t mysql_num_rows(MYSQL_RES* res);
该方法获取结果集中的行数
7、取出结果集中的一行记录
MYSQL_ROW mysql_fetch_row(MYSQL_RES* res);
从结果集中取出一行,并把它存放到一个行结构中。当数据用完或者出错时,返回为NULL。所以通常情况下该方法需要循环调用。
8、查看记录行的列数
unsigned in mysql_field_count(MYSQL * mysql);
9、释放结果集占用的内存
void mysql_free_result(MYSQL_RES* res);
执行完sql语句,得到返回的结果集,处理完数据后,需要调用该方法释放结果集的内存空间
10、获取错误信息
unsigned int mysql_error(MYSQL *mysql);//返回错误码
const char* mysql_error(MYSQL* mysql);//返回错误信息描述
二、程序示例
1、对数据库的表进行增删改操作,并不需要程序返回相应的结果:
①数据库的前期准备:
②代码:
//没有结果的查询
#include <stdio.h>
#include <unistd.h>
#include <mysql/mysql.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
int main()
{
MYSQL* mysql=mysql_init(NULL);
if(mysql==NULL)
{
printf("mysql init err\n");
exit(0);
}
//root有两个用户,一个是本地登陆的,一个是远程登录的用户
mysql=mysql_real_connect(mysql,"127.0.0.1","root","111111","c215",3306,NULL,0);
if(mysql==NULL)
{
printf("mysql connect err\n");
exit(0);
}
//执行sql语句
//1、char* sql="insert into stu values('小名',21)";//这个插入语句最后可以加分号也可以不加分号
//2、char * sql="delete stu from stu where name='小王'";
//3、
char* sql="update stu set age=18 where name='小名'";
int res=mysql_query(mysql,sql);
if(res!=0)
{
printf("mysql query er:%sr\n",mysql_error(mysql));
}
mysql_close(mysql);
}
③执行sql1语句在mysql中看到的结果:
④执行sql2语句在mysql中看到的结果:
⑤执行sql3语句在mysql中看到的结果:
2、执行select查询语句的时候,需要程序将数据表中查询的语句返回
①前期准备;
将之前c215中stu表的数据删完,然后进行下面操作:
②代码:
//没有结果的查询
#include <stdio.h>
#include <unistd.h>
#include <mysql/mysql.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
int main()
{
MYSQL* mysql=mysql_init(NULL);
if(mysql==NULL)
{
printf("mysql init err\n");
exit(0);
}
//root有两个用户,一个是本地登陆的,一个是远程登录的用户
mysql=mysql_real_connect(mysql,"127.0.0.1","root","111111","c215",3306,NULL,0);
if(mysql==NULL)
{
printf("mysql connect err\n");
exit(0);
}
char* sql="select * from stu";
int res=mysql_query(mysql,sql);
if(res!=0)
{
printf("mysql query er:%sr\n",mysql_error(mysql));
}
//准备拿到结果集,进行空间的分配
//不能通过结果的成功与否判断是否有数据
//而应该通过返回的几条决定是否有数据
MYSQL_RES* mysql_res=mysql_store_result(mysql);
//这里只能看获取结果是否成功
if(mysql_res==NULL)
{
printf("提取数据失败:%s\n",mysql_error(mysql));
exit(0);
}
//提取当前有多少条记录,这里可能会有条件限制,我需要那种数据
int num=mysql_num_rows(mysql_res);
if(num==0)//认为没有记录
{
printf("没有记录\n");
}
else//有数据
{
//取出结果集中的数据
printf("当前记录条数:%d\n",num);
//计算列数
int m=mysql_field_count(mysql);
printf("一行记录有%d列\n",m);
//循环打印
for(int i=0;i<num;i++)
{
//获取一行记录,通常是需要循环的,但是当前数据表中只有一条记录,所以没有进行循环
MYSQL_ROW mysql_row=mysql_fetch_row(mysql_res);
//printf("name=%s,age=%s\n",mysql_row[0],mysql_row[1]);
//循环打印各个列
for(int j=0;j<m;j++)
{
printf("row[%d]=%s ",j,mysql_row[j]);
}
printf("\n");
}
}
//释放结果集
mysql_free_result(mysql_res);
mysql_close(mysql);
}
③程序运行结果: