C/C++连接MySQL实战指南:执行SQL请求详解

在开发高性能或系统级应用时,C/C++因其接近硬件、运行效率高的特点被广泛使用。而当这类应用需要与数据库交互时,MySQL 提供了官方的 C API(即 MySQL Connector/C),使得开发者可以直接在 C/C++ 程序中连接、查询和操作 MySQL 数据库。

本文将聚焦于 如何使用 C/C++ 连接 MySQL 并发送 SQL 请求,涵盖从环境准备到执行查询的完整流程,并提供可直接运行的示例代码。


一、准备工作

1. 安装 MySQL 开发库

在 Linux 系统(如 Ubuntu/Debian)上,可通过以下命令安装 MySQL 客户端开发库:

arduino 复制代码
sudo apt-get install libmysqlclient-dev

在 CentOS/RHEL 上:

bash 复制代码
sudo yum install mysql-devel
# 或(较新版本)
sudo dnf install mysql-devel

Windows 用户可从 MySQL 官网 下载 Connector/C。

2. 编译链接选项

编译时需链接 libmysqlclient 库。例如:

复制代码
gcc -o myapp myapp.c -lmysqlclient

二、基本流程概览

使用 C API 操作 MySQL 的典型步骤如下:

  1. 初始化 MySQL 连接句柄(mysql_init()
  2. 连接到数据库(mysql_real_connect()
  3. 发送 SQL 请求(mysql_query()mysql_real_query()
  4. 处理结果集(如有)(mysql_store_result() / mysql_use_result()
  5. 释放资源并关闭连接(mysql_close()

三、连接数据库

c 复制代码
#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    MYSQL *conn;
    const char *server = "localhost";
    const char *user = "your_user";
    const char *password = "your_password";
    const char *database = "test_db";

    // 初始化连接结构
    conn = mysql_init(NULL);
    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        exit(1);
    }

    // 连接数据库
    if (mysql_real_connect(conn, server, user, password, database, 0, NULL, 0) == NULL) {
        fprintf(stderr, "Connection failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        exit(1);
    }

    printf("Connected to MySQL successfully!\n");

    // 后续操作...

    mysql_close(conn);
    return 0;
}

注意:请将 your_useryour_passwordtest_db 替换为实际值。


四、发送 SQL 请求

1. 执行非查询语句(INSERT / UPDATE / DELETE)

这些语句不返回结果集,只需检查是否执行成功:

c 复制代码
const char *sql = "INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com')";
if (mysql_query(conn, sql)) {
    fprintf(stderr, "Query error: %s\n", mysql_error(conn));
} else {
    printf("Insert successful. Affected rows: %llu\n", mysql_affected_rows(conn));
}

2. 执行查询语句(SELECT)

查询会返回结果集,需进一步处理:

ini 复制代码
const char *query = "SELECT id, name, email FROM users";
if (mysql_query(conn, query)) {
    fprintf(stderr, "SELECT error: %s\n", mysql_error(conn));
    return 1;
}

MYSQL_RES *result = mysql_store_result(conn);
if (result == NULL) {
    fprintf(stderr, "Store result error: %s\n", mysql_error(conn));
    return 1;
}

// 获取字段数量
int num_fields = mysql_num_fields(result);

// 遍历每一行
MYSQL_ROW row;
while ((row = mysql_fetch_row(result))) {
    for (int i = 0; i < num_fields; i++) {
        printf("%s\t", row[i] ? row[i] : "NULL");
    }
    printf("\n");
}

// 释放结果集
mysql_free_result(result);

使用 mysql_store_result() 会一次性将全部结果加载到内存,适用于数据量较小的场景;若处理大量数据,可考虑 mysql_use_result() 流式读取。


五、错误处理建议

  • 始终检查 mysql_query() 的返回值。
  • 使用 mysql_error(conn) 获取详细错误信息。
  • 在程序退出前务必调用 mysql_close() 释放连接资源。

六、编译与运行示例

假设源文件为 mysql_demo.c,编译命令如下:

css 复制代码
gcc -o mysql_demo mysql_demo.c $(mysql_config --cflags --libs)

mysql_config 是 MySQL 提供的工具,可自动输出正确的编译和链接参数。


七、小结

通过 MySQL 的 C API,C/C++ 程序可以高效地与数据库交互。虽然相比高级语言(如 Python、Java)略显繁琐,但在对性能、资源控制有严格要求的场景下,C/C++ 仍是不可替代的选择。

掌握连接、发送请求、处理结果这三个核心环节,即可构建出稳定可靠的数据库客户端程序。后续还可深入学习预处理语句(mysql_stmt_* 系列函数)以提升安全性和效率,防止 SQL 注入。

相关推荐
awljwlj1 小时前
黑马点评复习—缓存相关【包含可能的问题和基础知识复习】
java·后端·spring·缓存
XY_墨莲伊1 小时前
【实战项目】基于B/S结构Flask+Folium技术的出租车轨迹可视化分析系统(文末含完整源代码)
开发语言·后端·python·算法·机器学习·flask
神奇小汤圆1 小时前
为什么Claude Code这么强?我从泄漏的源码里挖到了核心秘密
后端
精品源码屋1 小时前
千万级CSV/Excel表统计教程:基于本地数据库的自然语言单表、多表分析 | DT-Bot工作流
后端
Gopher_HBo1 小时前
CompletableFuture运用原理
java·后端
Leinwin2 小时前
GPT-6 API接入完全指南:Symphony架构下的多模态调用与最佳实践
后端·python·flask
snakeshe10102 小时前
Java Web 应用部署实战:从单机到分布式的三种方式
后端
lolo大魔王2 小时前
Go语言的函数与指针的定义
开发语言·后端·golang