MySQL:C语言链接

目录

mysql接口介绍

mysql_init

mysql_real_connect

mysql_query

mysql_store_result

mysql_num_rows

mysql_num_fields

mysql_fetch_fields

mysql_fetch_row

mysql_close


mysql接口介绍

以下mysql的接口并非线程安全,多线程里要么各自调用各自的函数,要么加锁

mysql_init

cpp 复制代码
MYSQL *mysql_init(MYSQL *mysql);

返回值:

该函数会返回一个mysql句柄

参数:

若参数为nullptr,则库自动分配一个mysql句柄(常用)

cpp 复制代码
MYSQL *conn = mysql_init(NULL);

或者自己创建一个MYSQL变量传递进去自己进行管理

cpp 复制代码
MYSQL m;
MYSQL *conn = mysql_init(&m);

mysql_real_connect

cpp 复制代码
MYSQL *mysql_real_connect(
    MYSQL *mysql,               // mysql_init 返回的句柄
    const char *host,           // 主机名或 IP,NULL = localhost
    const char *user,           // 用户名
    const char *passwd,         // 密码,NULL = 空密码
    const char *db,             // 默认库,NULL = 不选库
    unsigned int port,          // 端口,0 = 3306
    const char *unix_socket,    // Unix socket 路径,NULL = 自动
    unsigned long client_flag   // 位标记,0 即可
);

mysql_real_connect()是MySQL C API里真正建立TCP/IP连接的函数

返回值:

成功:返回与传入相同的MySQL*指针(后续所有 SQL 都靠它)

失败:返回NULL

port设为0表示用库默认3306

mysql_query

cpp 复制代码
int mysql_query(MYSQL *mysql, const char *stmt_str);

mysql_query()负责下发mysql命令

mysql:mysql句柄(可通过mysql_init()获得)

例如:

复制代码
mysql_query(conn, "SELECT id, name FROM user WHERE age > 18")

返回值:

成功:返回0

失败:返回非0

mysql_query()只负责发,不关心结果集(如果是查询语句则需要关心结果集)

想获取数据还需要继续调用mysql_store_result()

mysql_store_result

cpp 复制代码
MYSQL_RES *mysql_store_result(MYSQL *mysql);

mysql_store_result()函数是一次性把查询结果从服务器全部拉到客户端内存

返回值:

返回一个MYSQL_RES*结果集句柄(后续可以用mysql_fetch_row()遍历)

这是拿到SELECT结果的最常用方式

mysql_num_rows

cpp 复制代码
my_ulonglong mysql_num_rows(MYSQL_RES *result);

该函数用于获取结果行数

传入一个结果集句柄,返回结果行数

mysql_num_fields

cpp 复制代码
unsigned int mysql_num_fields(MYSQL_RES *result);

该函数用于获取结果列数

传入一个结果集句柄,返回结果列数

mysql_fetch_fields

cpp 复制代码
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result);

该函数主要是一次性拿到结果集所有列的元数据数组,可直接用下标访问每一列的信息(名字、类型、长度、精度、是否主键...)

经典用法:

cpp 复制代码
int fields = mysql_num_fields(res);
MYSQL_FIELD *field = mysql_fetch_fields(res);
int i = 0;
for(; i < fields; i++)
{
    cout << field[i].name << " ";
}
cout << endl;

mysql_fetch_row

cpp 复制代码
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

该函数是逐行读取结果集数据的核心函数

mysql_fetch_row()函数内部有一个"行游标",每次调用就把这个游标向下移动一行,并返回刚指向的那一行的地址,游标到尾巴后就返回NULL,循环结束

返回值:

成功返回指向字符串数组的指针,下标对应列号,结束返回NULL(MYSQL_ROW其实就是char**,当成二维数组使用)

经典用法:

cpp 复制代码
i = 0;
MYSQL_ROW line;
for(; i < nums; i++)
{
    line = mysql_fetch_row(res);
    int j = 0;
    for(; j < fields; j++)
    {
        cout << line[j] << " ";
    }
    cout << endl;
}

mysql_close

cpp 复制代码
void mysql_close(MYSQL *mysql);

该函数用于关闭mysql链接

和malloc后需要free一样


相关推荐
蓝鸟197410 分钟前
Oracle超大DMP备份文件瘦身、日志精简、磁盘空间优化实战方案日志
数据库·oracle·数据库运维·生产运维实战·oracle避坑·磁盘空间优化·oracle日志清理
梦想的旅途219 分钟前
企业微信外部群主动调用:RPA 接口与官方 API 的技术边界
网络·mysql·自动化·企业微信·rpa
金融支付架构实战指南23 分钟前
CQRS + 命令模式 + 事件驱动 + 数据库持久化
数据库·ddd·命令模式·领域驱动模型
sevenll0743 分钟前
DocKit agentic MongoDB GUI 客户端 - 用自然语言和你的数据对话
数据库·mongodb·nosql·agent·桌面客户端
团象科技1 小时前
从一线实操案例拆解不同出海团队落地海外VPS运维独立站的路径细节
大数据·数据库·人工智能
小马爱打代码1 小时前
框架 - 组件 - 中间件:生产级参数配置指引
数据库·中间件
asdfg12589631 小时前
一文通俗理解JDBC中的核心概念+案例
java·数据库·oracle·jdbc
点灯小铭2 小时前
基于单片机与DAC0832的双路波形信号发生系统设计
数据库·单片机·mongodb·毕业设计·课程设计·期末大作业
小陈phd2 小时前
Text2SQL智能体学习笔记(二)——NL2SQL落地的隐形基石:元数据库
数据库·笔记·学习
霸道流氓气质2 小时前
阿里云 OSS 从零到实战:概念、配置与 Spring Boot 集成指南
数据库·spring boot·阿里云