实用指南:MySQL笔记---C/C++访问MySQL数据库

news/2025/11/8 23:12:40/文章来源:https://www.cnblogs.com/tlnshuju/p/19203259

实用指南:MySQL笔记---C/C++访问MySQL数据库

2025-11-08 23:10  tlnshuju  阅读(0)  评论(0)    收藏  举报

在 C++ 中访问 MySQL 数据库,最常用的方式是通过官方提供的MySQL Connector/C++(C++ 驱动)或基于 C API 的封装。

  • MySQL Connector/C++:面向对象封装的库,更加适配C++,也更方便。
  • MySQL C API:是面向过程封装的库,主要用于需要兼容C语言的场景,使用起来比较麻烦。

1. MySQL C API

MySQL C API 是 MySQL 提供的一套基于 C 语言的底层接口,用于与 MySQL 数据库进行交互。它是许多高层语言(如 Python、PHP)数据库驱动的底层实现,功能全面但需要手动管理资源。

使用 MySQL C API 的基本步骤:

初始化连接句柄 → 连接数据库 → 执行 SQL 语句 → 处理结果集 → 释放资源 → 关闭连接

1.1 安装

安装 MySQL C 客户端开发库(mysqlclient):

sudo apt-get update
sudo apt-get install libmysqlclient-dev

头文件路径:

/usr/include/mysql/mysql.h
#include 

1.2 常用接口与使用方法

1.2.1 初始化连接句柄
MYSQL* mysql_init(MYSQL* mysql);
  • 功能:初始化一个 MYSQL 结构体(连接句柄),用于后续数据库操作。
  • 参数
    • mysql:若为 NULL,函数会自动分配一个新的 MYSQL 结构体;若传入已存在的句柄,会重置其状态。
  • 返回值
    • 成功:返回初始化后的 MYSQL* 句柄;
    • 失败:返回 NULL(内存不足)。
1.2.2 连接数据库
MYSQL* mysql_real_connect(MYSQL* mysql,          // 已初始化的句柄const char* host,      // 主机名("localhost"或IP,本地可填NULL)const char* user,      // 用户名(如"root")const char* passwd,    // 密码const char* db,        // 要连接的数据库名(NULL表示不指定)unsigned int port,     // 端口号(默认3306,填0表示默认)const char* unix_socket,// Unix域套接字(NULL表示不使用)unsigned long client_flag  // 客户端标志(0表示默认)
);
  • 功能:通过初始化的句柄连接到 MySQL 服务器。
  • 返回值
    • 成功:返回 mysql 句柄(与传入的一致);
    • 失败:返回 NULL。
1.2.3 执行 SQL 语句

(1)mysql_query

int mysql_query(MYSQL* mysql, const char* stmt_str);
  • 功能:执行字符串形式的 SQL 语句(适合普通文本 SQL)。
  • 参数
    • stmt_str:以 \0 结尾的 SQL 字符串(如 "SELECT * FROM user")。
  • 返回值
    • 成功:0;
    • 失败:非 0。

(2)mysql_real_query

int mysql_real_query(MYSQL* mysql, const char* stmt_str, unsigned long length);
  • 功能:执行 SQL 语句(适合包含二进制数据或 \0 字符的 SQL,需指定长度)。
  • 参数:
    • length:SQL 字符串的长度(字节数)。
  • 返回值:与 mysql_query 一致。
1.2.4 处理结果集

执行查询语句(如 SELECT)后,需通过以下函数获取并解析结果。

  • MYSQL_RES:查询语句的结果,结果中的所有数据都以字符串的形式保存,可抽象地认为这是一个存放字符串的二维数组(表格)。
  • MYSQL_ROW:查询结果中的一行(数据),本质是char**类型。
    typedef char **MYSQL_ROW;                /* return data as array of strings */
  • MYSQL_FIELD:查询结果中一列(属性),本质是包含某列各种属性的结构体。
    typedef struct MYSQL_FIELD {char *name;               /* Name of column */char *org_name;           /* Original column name, if an alias */char *table;              /* Table of column if column was a field */char *org_table;          /* Org table name, if table was an alias */char *db;                 /* Database for table */char *catalog;            /* Catalog for table */char *def;                /* Default value (set by mysql_list_fields) */unsigned long length;     /* Width of column (create length) */unsigned long max_length; /* Max width for selected set */unsigned int name_length;unsigned int org_name_length;unsigned int table_length;unsigned int org_table_length;unsigned int db_length;unsigned int catalog_length;unsigned int def_length;unsigned int flags;         /* Div flags */unsigned int decimals;      /* Number of decimals in field */unsigned int charsetnr;     /* Character set */enum enum_field_types type; /* Type of field. See mysql_com.h for types */void *extension;
    } MYSQL_FIELD;

(1)获取结果集

  • mysql_store_result
    • 原型
      MYSQL_RES* mysql_store_result(MYSQL* mysql);
    • 功能:一次性将所有查询结果读取到客户端内存,适合小结果集(后续可随机访问)。
    • 返回值:成功返回结果集 MYSQL_RES*,失败返回 NULL。
  • mysql_use_result
    • 原型
      MYSQL_RES* mysql_use_result(MYSQL* mysql);
    • 功能:逐行从服务器获取结果(不缓存到客户端),适合大结果集(内存占用低,但必须读完所有行才能执行新查询)。
    • 返回值:成功返回单行数据结果集,失败返回 NULL。

(2)获取行数与列数

  • mysql_num_rows
    • 原型
      my_ulonglong mysql_num_rows(MYSQL_RES* result);
    • 功能:获取结果集中的行数(仅对 mysql_store_result 有效)。
  • mysql_num_fields
    • 原型
      unsigned int mysql_num_fields(MYSQL_RES* result);
    • 功能:获取结果集中的列数。

(3)获取行数据

MYSQL_ROW mysql_fetch_row(MYSQL_RES* result);
  • 功能:从结果集中获取一行数据(以字符串数组形式返回)。
  • 返回值
    • 成功:返回 MYSQL_ROW(本质是 char**,每个元素对应一列的值,NULL 表示该列值为 NULL);
    • 无更多行或失败:返回 NULL。

(4)获取字段信息

MYSQL_FIELD* mysql_fetch_field(MYSQL_RES* result);
  • 功能:获取列的元信息(如字段名、类型)。
  • 返回值:返回下一个字段的 MYSQL_FIELD 结构体(包含 name、type 等成员),无更多字段时返回 NULL。
1.2.5 错误处理
  • mysql_error
    • 原型
      const char* mysql_error(MYSQL* mysql);
    • 功能:返回最后一次操作的错误信息(字符串)。
  • mysql_errno
    • 原型
      unsigned int mysql_errno(MYSQL* mysql);
    • 功能:返回最后一次操作的错误码(整数,可参考 MySQL 错误码表)。
1.2.6 关闭连接与释放资源
  • mysql_close
    • 原型
      void mysql_close(MYSQL* mysql);
    • 功能:关闭数据库连接并释放 MYSQL 句柄。
  • mysql_free_result
    • 原型
      void mysql_free_result(MYSQL_RES* result);
    • 功能:释放结果集(必须在处理完结果后调用)。

1.3 使用示例

#include 
#include 
#include 
std::string host = "localhost";
std::string user = "****";
std::string password = "****";
std::string database = "test_connector";
unsigned int port = 3306;
int main()
{// 初始化连接MYSQL *conn = mysql_init(nullptr);if(!mysql_real_connect(conn, host.c_str(), user.c_str(), password.c_str(), database.c_str(), port, nullptr, 0)){std::cerr << "建立连接失败! " << mysql_error(conn) << std::endl;return 1;}// 查询std::string sql = "SELECT * FROM user";if(mysql_query(conn, sql.c_str())){std::cerr << "查询失败! " << mysql_error(conn) << std::endl;return 1;}// 处理结果MYSQL_RES *res = mysql_store_result(conn);my_ulonglong row_num = mysql_num_rows(res);my_ulonglong col_num = mysql_num_fields(res);MYSQL_FIELD *fild;while(fild = mysql_fetch_field(res)){std::cout << fild->name << '\t';}std::cout << std::endl;MYSQL_ROW row;while(row = mysql_fetch_row(res)){for(int i = 0; i < row_num; i++){std::cout << row[i] << "\t";}std::cout << std::endl;}// 释放资源mysql_free_result(res);mysql_close(conn);return 0;
}

编译时需链接 MySQL C 客户端库(-lmysqlclient):

g++ -o test test.cpp -std=c++11 -lmysqlclient

2. MySQL Connector/C++

MySQL Connector/C++ 是 MySQL 官方提供的 C++ 驱动库,用于在 C++ 程序中与 MySQL 数据库交互。

它提供了两套主要接口:传统 API(基于 JDBC 风格的封装,兼容旧版本) 和 X DevAPI(现代面向对象接口,支持关系型和文档型数据操作,推荐使用)。

详细的介绍留待将来补充。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/960055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

山石CLI抓包

//设置过滤条件,源目ip、端口等debug dp filter dst-ip 10.4.139.11 debug dp filter src-ip 58.247.133.235 dst-ip 114.255.86.147 dst-port 500 debug dp filter src-ip 10.4.248.254debug dp basic debug dp sno…

安装Gradle超时java.net.SocketTimeoutException: Read timed out

Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-8.13-bin.zip. Reason: java.net.SocketTimeoutException: Read timed out 全局配置腾讯云镜像 这个方法只需要设置一…

点击领取文章

联系老师微信:redianvip888 拼多多不要提微信,直接联系老师撰写文章。 拼多多不需要再沟通,直接微信联系 拼多多不要提微信,拼多多不要提微信,

使用DS18B20过程中的一些坑

最近在使用DS18B20的时候,一开始发现读取温度只会返回0xff,但是温度不可能这么高,后来想到可能是芯片根本没有回应,但是读取ROM命令的时候返回又是正常的,所以不可能是读写时序的问题。又仔细查了一些资料,发现发…

Buildroot使用说明

小白专用,Buildroot 超简单入门指南 | 开源软件 https://zhuanlan.zhihu.com/p/508579943

Buildroot使用说明

小白专用,Buildroot 超简单入门指南 | 开源软件 https://zhuanlan.zhihu.com/p/508579943

实用指南:神经网络常用激活函数公式

实用指南:神经网络常用激活函数公式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

实用指南:神经网络常用激活函数公式

实用指南:神经网络常用激活函数公式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

单片机进入 B. 中断无限循环异常消除方法

单片机进入 B. 中断无限循环异常消除方法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

Kotlin 协程之 Flow 操作符大全 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

202511做题记录

202511 做题记录加粗斜体表示思考时被卡了的部分。 打 \(*\) 的表示做过的重新想(做)一遍。 打 \(^?\) 的表示看了题解。 打 ~ 的表示还没做 / 还没写上来。 特别的,\(^!\) 和 \(*^?\) 都表示做过一遍还是不会 �…

Paper Reading:Neural Prototype Trees for Interpretable Fine-grained Image Recognition

本文提出了一种面向细粒度图像识别的本质可解释深度学习模型——神经原型树(ProtoTree),将原型学习与决策树结构相结合。首先使用卷积神经网络(CNN)将输入图像映射为潜在特征表示;然后通过一个二叉决策树进行层次…

2025.11 NOIP 集训模拟赛选记

希望能学到点儿东西吧。 Public NOIP Round #8 【NOIP Round #8】位集 【NOIP Round #8】偷塔 【NOIP Round #8】降雨 【NOIP Round #8】矩阵 Public NOIP Round #7 【NOIP Round #7】填写数字 【NOIP Round #7】排列计…

从指令遵循到价值对齐:医疗大语言模型的进阶优化、对齐与工具集成综合技能白皮书

从指令遵循到价值对齐:医疗大语言模型的进阶优化、对齐与工具集成综合技能白皮书pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

Mrakdown - YQR

Mrakdown标题# **粗体 *斜体 ***粗斜 ~~删除引用 ---或***分割 ----图 超链接列表 1,代码

20232322 2025-2026-1 《网络与系统攻防技术》实验四实验报告

一.实验内容恶意代码的文件类型识别,脱壳与字符串提取。 使用IDA Pro静态或动态分析所给exe文件,找到输出成功信息的方法。 分析自制恶意代码样本并撰写报告。 取证分析实践。二.实验目的掌握恶意代码的分析技术,像…

高级语言程序设计第四节个人作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/gjyycx/homework/14577 学号:102500426 姓名:康凯帆 Fan.: 11-08 22:34:19Fan.: 11-0…

Vue3 项目首屏加载性能优化全攻略 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025.11.8 测试

2025.11.8 测试T1 刚开场想到贪心方向,然后一直在证明 然后证了1个多小时,证明没证出来,但思路理清了 就是有一种情况,就是最小值和某个非最大值搭配,不会写,但举了几个例子都不会出现这种情况成为最优解 然后就…

C# 变量详解:从基础概念到高级应用 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …