服务器测评网
我们一直在努力

Linux C程序如何连接并操作MySQL数据库?

在Linux环境下使用C语言访问MySQL数据库是开发高效、可靠后端应用的常见需求,本文将详细介绍环境搭建、核心API使用、事务处理及错误处理等关键环节,帮助开发者掌握这一技术。

环境准备与安装

在开始开发前,需确保系统已安装MySQL数据库及开发库,以Ubuntu系统为例,可通过以下命令安装必要组件:

sudo apt update
sudo apt install mysql-server libmysqlclient-dev

安装完成后,需创建测试数据库及用户,并授予相应权限:

CREATE DATABASE test_db;
CREATE USER 'c_user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON test_db.* TO 'c_user'@'localhost';
FLUSH PRIVILEGES;

核心API连接与查询

MySQL C API提供了丰富的函数用于数据库操作,基本流程包括初始化连接、执行SQL、处理结果集及释放资源,以下为关键步骤示例:

初始化连接

使用mysql_init()分配连接句柄,并通过mysql_real_connect()建立连接:

MYSQL *conn;
conn = mysql_init(NULL);
if (!mysql_real_connect(conn, "localhost", "c_user", "password", "test_db", 0, NULL, 0)) {
    fprintf(stderr, "Connection error: %s\n", mysql_error(conn));
    exit(1);
}

执行SQL语句

通过mysql_query()执行非查询类语句,或使用mysql_store_result()获取查询结果集:

const char *query = "INSERT INTO users (name, age) VALUES ('Alice', 25)";
if (mysql_query(conn, query)) {
    fprintf(stderr, "Insert error: %s\n", mysql_error(conn));
}

处理结果集

对于SELECT查询,需遍历结果集并提取数据:

MYSQL_RES *result;
MYSQL_ROW row;
if (mysql_query(conn, "SELECT name, age FROM users")) {
    fprintf(stderr, "Query error: %s\n", mysql_error(conn));
}
result = mysql_store_result(conn);
while ((row = mysql_fetch_row(result))) {
    printf("Name: %s, Age: %s\n", row[0], row[1]);
}
mysql_free_result(result);

释放资源

操作完成后,需关闭连接并释放句柄:

mysql_close(conn);

事务处理

MySQL支持事务操作,可通过以下函数实现ACID特性:

// 开启事务
mysql_query(conn, "START TRANSACTION");
// 执行多个SQL语句
mysql_query(conn, "UPDATE accounts SET balance = balance - 100 WHERE id = 1");
mysql_query(conn, "UPDATE accounts SET balance = balance + 100 WHERE id = 2");
// 提交或回滚
if (/* 条件满足 */) {
    mysql_query(conn, "COMMIT");
} else {
    mysql_query(conn, "ROLLBACK");
}

错误处理与最佳实践

完善的错误处理是程序稳定性的关键,建议使用mysql_error()获取详细错误信息,并在关键操作后检查返回值,应注意以下事项:

  1. 防止SQL注入:使用mysql_real_escape_string()对用户输入进行转义,或采用预处理语句(mysql_stmt_prepare()等)。
  2. 资源管理:确保及时释放结果集和连接句柄,避免内存泄漏。
  3. 连接池:高频应用场景下,可考虑实现连接池复用数据库连接。

性能优化技巧

优化方向 具体措施
批量操作 使用mysql_next_result()处理多语句查询,减少网络往返
索引利用 为查询字段建立适当索引,避免全表扫描
游标使用 对于大数据集,采用mysql_use_result()流式获取结果,降低内存占用
超时设置 通过mysql_options()设置连接超时,避免长时间阻塞

完整示例代码

以下为完整示例,展示从连接到查询的完整流程:

#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
    MYSQL *conn;
    MYSQL_RES *result;
    MYSQL_ROW row;
    conn = mysql_init(NULL);
    if (!mysql_real_connect(conn, "localhost", "c_user", "password", "test_db", 0, NULL, 0)) {
        fprintf(stderr, "Connection failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }
    if (mysql_query(conn, "CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT, name VARCHAR(50), age INT, PRIMARY KEY (id))")) {
        fprintf(stderr, "Table creation failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }
    if (mysql_query(conn, "INSERT INTO users (name, age) VALUES ('Bob', 30)")) {
        fprintf(stderr, "Insert failed: %s\n", mysql_error(conn));
    }
    if (mysql_query(conn, "SELECT name, age FROM users")) {
        fprintf(stderr, "Query failed: %s\n", mysql_error(conn));
    }
    result = mysql_store_result(conn);
    printf("Users:\n");
    while ((row = mysql_fetch_row(result))) {
        printf("Name: %s, Age: %s\n", row[0], row[1]);
    }
    mysql_free_result(result);
    mysql_close(conn);
    return 0;
}

编译时需链接MySQL客户端库:

gcc -o mysql_app mysql_app.c $(mysql_config --cflags --libs)

开发者可系统掌握Linux环境下C语言操作MySQL数据库的方法,为构建高性能应用奠定基础,实际开发中,还需根据具体需求调整参数和优化策略,确保程序的安全性和效率。

赞(0)
未经允许不得转载:好主机测评网 » Linux C程序如何连接并操作MySQL数据库?