利用C语言访问mysql

一、相关头文件以及函数:

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);
}

③程序运行结果:
在这里插入图片描述

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仟各

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值