信息发布→ 登录 注册 退出

c++怎么连接和操作MySQL数据库_c++数据库访问与SQL执行实例

发布时间:2025-11-17

点击量:
答案是使用MySQL C API连接数据库需先安装开发库,包含mysql.h头文件,调用mysql_init初始化,mysql_real_connect建立连接,执行查询或插入操作后释放资源。

在C++中连接和操作MySQL数据库,通常使用MySQL官方提供的C API(即 MySQL Connector/C)或其封装库如 MySQL++。本文以原生的 MySQL C API 为例,介绍如何连接、查询、插入数据,并给出完整实例。

1. 环境准备与依赖安装

确保系统已安装 MySQL 开发库:

  • Ubuntu/Debian:sudo apt-get install libmysqlclient-dev
  • CentOS/RHEL:sudo yum install mysql-devel
  • Windows:下载并配置 MySQL Connector/C,设置头文件和库路径

编译时需链接库:-lmysqlclient

2. 包含头文件并初始化连接

使用 提供的接口进行数据库操作。

#include 
#include 

int main() {
    MYSQL *conn;
    conn = mysql_init(NULL);

    if (!conn) {
        std::cerr << "初始化失败" << std::endl;
        return 1;
    }

    // 连接数据库
    if (!mysql_real_connect(conn, "localhost", "root", "password",
                           "testdb", 3306, NULL, 0)) {
        std::cerr << "连接失败: " << mysql_error(conn) << std::endl;
        mysql_close(conn);
        return 1;
    }

    std::cout << "数据库连接成功!" << std::endl;

说明:

  • mysql_init() 初始化连接句柄
  • mysql_real_connect() 建立连接,参数依次为:主机、用户名、密码、数据库名、端口等

3. 执行SQL语句

使用 mysql_query() 执行非查询语句,用 mysql_use_result()mysql_store_result() 处理查询结果。

    // 插入数据
    const char *insert_sql = "INSERT INTO users (name, age) VALUES ('张三', 25)";
    if (mysql_query(conn, insert_sql)) {
        std::cerr << "插入失败: " << mysql_error(conn) << std::endl;
    } else {
        std::cout << "插入成功,影响行数: " << mysql_affected_rows(conn) << std::endl;
    }

    // 查询数据
    if (mysql_query(conn, "SELECT id, name, age FROM users")) {
        std::cerr << "查询失败: " << mysql_error(conn) << std::endl;
    } else {
        MYSQL_RES *result = mysql_store_result(conn);
        if (result) {
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(result))) {
                std::cout << "ID: " << row[0] 
                          << ", 姓名: " << row[1] 
                          << ", 年龄: " << row[2] << std::endl;
            }
            mysql_free_result(result);
        }
    }

关键函数说明:

  • mysql_query():执行SQL字符串
  • mysql_store_result():将结果集全部取回内存
  • mysql_fetch_row():逐行获取数据,返回字符串数组
  • mysql_free_result():释放结果集资源

4. 预处理语句(防SQL注入)

对于带参数的操作,推荐使用预处理语句。

    MYSQL_STMT *stmt = mysql_stmt_init(conn);
    const char *sql = "INSERT INTO users (name, age) VALUES (?, ?)";
    
    if (mysql_stmt_prepare(stmt, sql, strlen(sql))) {
        std::cerr << "预处理失败: " << mysql_stmt_error(stmt) << std::endl;
        mysql_stmt_close(stmt);
        return 1;
    }

    // 绑定参数
    MYSQL_BIND bind[2];
    std::string name = "李四";
    int age = 30;

    memset(bind, 0, sizeof(bind));
    bind[0].buffer_type = MYSQL_TYPE_STRING;
    bind[0].buffer = (char*)name.c_str();
    bind[0].buffer_length = name.length();

    bind[1].buffer_type = MYSQL_TYPE_LONG;
    bind[1].buffer = &age;

    if (mysql_stmt_bind_param(stmt, bind)) {
        std::cerr << "绑定参数失败: " << mysql_stmt_error(stmt) << std::endl;
    }

    if (mysql_stmt_execute(stmt)) {
        std::cerr << "执行失败: " << mysql_stmt_error(stmt) << std::endl;
    } else {
        std::cout << "预处理插入成功" << std::endl;
    }

    mysql_stmt_close(stmt);

5. 关闭连接与清理

程序结束前务必释放资源。

    mysql_close(conn);
    return 0;
}

完整编译命令(Linux):

g++ -o db_example db_example.cpp -lmysqlclient

意事项:

  • 所有操作应包含错误检查
  • 多线程环境下需确保连接安全或使用连接池
  • 生产环境建议封装成类管理连接生命周期
基本上就这些。通过 MySQL C API 可以高效地在 C++ 中操作数据库,虽然较底层,但性能好、控制力强。
标签:# 线程  # 依次为  # 或其  # 查询结果  # 为例  # 推荐使用  # 句柄  # 连接数据库  # 绑定  # 头文件  # debian  # linux  # 数据库  # 多线程  # c++  # 接口  # 字符串  # 封装  # sql  # stream  # win  # ios  # ai  # ubuntu  # windows  # centos  # mysql  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!