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 注入。

相关推荐
青云计划14 小时前
知光项目知文发布模块
java·后端·spring·mybatis
Victor35614 小时前
MongoDB(9)什么是MongoDB的副本集(Replica Set)?
后端
Victor35614 小时前
MongoDB(8)什么是聚合(Aggregation)?
后端
yeyeye11116 小时前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
Tony Bai16 小时前
告别 Flaky Tests:Go 官方拟引入 testing/nettest,重塑内存网络测试标准
开发语言·网络·后端·golang·php
+VX:Fegn089517 小时前
计算机毕业设计|基于springboot + vue鲜花商城系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
程序猿阿伟17 小时前
《GraphQL批处理与全局缓存共享的底层逻辑》
后端·缓存·graphql
小小张说故事17 小时前
SQLAlchemy 技术入门指南
后端·python
识君啊17 小时前
SpringBoot 事务管理解析 - @Transactional 的正确用法与常见坑
java·数据库·spring boot·后端
想用offer打牌18 小时前
MCP (Model Context Protocol) 技术理解 - 第五篇
人工智能·后端·mcp