C语言操作MySQL从入门到精通

大家好,我是 V 哥。今天给大家整理的内容是关于使用 C 语言操作 MySQL 数据库的详细介绍,从入门到精通,并配有案例代码和注释,帮助小白快速上手。

基本操作

1. 环境准备

在开始之前,你需要安装 MySQL 数据库和 MySQL Connector/C 开发库。以 Ubuntu 系统为例,可以使用以下命令进行安装:

bash 复制代码
sudo apt-get update
sudo apt-get install mysql-server libmysqlclient-dev

2. 入门:连接到 MySQL 数据库

以下是一个简单的 C 语言程序,用于连接到 MySQL 数据库:

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

int main() {
    // 初始化 MySQL 连接对象
    MYSQL *conn = mysql_init(NULL);

    if (conn == NULL) {
        // 初始化失败,输出错误信息
        fprintf(stderr, "mysql_init() failed\n");
        return 1;
    }

    // 尝试连接到 MySQL 数据库
    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        // 连接失败,输出错误信息
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        // 关闭连接
        mysql_close(conn);
        return 1;
    }

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

    // 关闭连接
    mysql_close(conn);

    return 0;
}

代码解释

  • mysql_init(NULL):初始化一个 MySQL 连接对象。
  • mysql_real_connect():尝试连接到指定的 MySQL 数据库。需要提供主机名、用户名、密码、数据库名等信息。
  • mysql_error(conn):获取 MySQL 操作的错误信息。
  • mysql_close(conn):关闭 MySQL 连接。

3. 执行 SQL 查询语句

以下是一个执行简单 SQL 查询语句的示例:

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

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

    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return 1;
    }

    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 定义要执行的 SQL 查询语句
    const char *query = "SELECT * FROM your_table";

    // 执行 SQL 查询语句
    if (mysql_query(conn, query) != 0) {
        // 查询失败,输出错误信息
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 获取查询结果集
    MYSQL_RES *result = mysql_store_result(conn);

    if (result == NULL) {
        // 获取结果集失败,输出错误信息
        fprintf(stderr, "mysql_store_result() failed: %s\n", mysql_error(conn));
        mysql_close(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 ", row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }

    // 释放结果集
    mysql_free_result(result);
    // 关闭连接
    mysql_close(conn);

    return 0;
}

代码解释

  • mysql_query(conn, query):执行指定的 SQL 查询语句。
  • mysql_store_result(conn):将查询结果存储在内存中,并返回一个结果集对象。
  • mysql_num_fields(result):获取结果集中的列数。
  • mysql_fetch_row(result):从结果集中获取下一行数据。
  • mysql_free_result(result):释放结果集占用的内存。

4. 插入数据

以下是一个向数据库中插入数据的示例:

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

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

    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return 1;
    }

    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 定义要插入的数据
    const char *name = "John Doe";
    int age = 30;

    // 构建插入 SQL 语句
    char query[256];
    snprintf(query, sizeof(query), "INSERT INTO your_table (name, age) VALUES ('%s', %d)", name, age);

    // 执行插入操作
    if (mysql_query(conn, query) != 0) {
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    printf("Data inserted successfully!\n");

    // 关闭连接
    mysql_close(conn);

    return 0;
}

代码解释

  • 使用 snprintf() 函数构建插入 SQL 语句。
  • mysql_query(conn, query):执行插入 SQL 语句。

5. 更新和删除数据

更新数据
c 复制代码
#include <mysql/mysql.h>
#include <stdio.h>
#include <string.h>

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

    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return 1;
    }

    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 构建更新 SQL 语句
    char query[256];
    snprintf(query, sizeof(query), "UPDATE your_table SET age = 31 WHERE name = 'John Doe'");

    // 执行更新操作
    if (mysql_query(conn, query) != 0) {
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    printf("Data updated successfully!\n");

    // 关闭连接
    mysql_close(conn);

    return 0;
}
删除数据
c 复制代码
#include <mysql/mysql.h>
#include <stdio.h>
#include <string.h>

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

    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return 1;
    }

    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    // 构建删除 SQL 语句
    char query[256];
    snprintf(query, sizeof(query), "DELETE FROM your_table WHERE name = 'John Doe'");

    // 执行删除操作
    if (mysql_query(conn, query) != 0) {
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    printf("Data deleted successfully!\n");

    // 关闭连接
    mysql_close(conn);

    return 0;
}

6. 错误处理和资源管理

在实际开发中,需要更加完善的错误处理和资源管理机制。例如,可以将数据库连接和操作封装成函数,方便复用和管理。

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

// 连接到 MySQL 数据库
MYSQL* connect_to_mysql() {
    MYSQL *conn = mysql_init(NULL);

    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return NULL;
    }

    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return NULL;
    }

    return conn;
}

// 执行 SQL 查询语句
int execute_query(MYSQL *conn, const char *query) {
    if (mysql_query(conn, query) != 0) {
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
        return 1;
    }
    return 0;
}

int main() {
    MYSQL *conn = connect_to_mysql();

    if (conn == NULL) {
        return 1;
    }

    const char *query = "SELECT * FROM your_table";
    if (execute_query(conn, query) != 0) {
        mysql_close(conn);
        return 1;
    }

    MYSQL_RES *result = mysql_store_result(conn);

    if (result == NULL) {
        fprintf(stderr, "mysql_store_result() failed: %s\n", mysql_error(conn));
        mysql_close(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 ", row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }

    mysql_free_result(result);
    mysql_close(conn);

    return 0;
}

通过以上步骤,你可以逐步掌握使用 C 语言操作 MySQL 数据库的基本方法,从连接数据库、执行查询、插入数据到更新和删除数据,并且学会了基本的错误处理和资源管理。

在C语言中,如何处理MySQL数据库连接错误?

在 C 语言中使用 MySQL 数据库时,数据库连接可能会因为各种原因失败,如网络问题、用户名密码错误、数据库服务未启动等。以下是详细介绍如何处理 MySQL 数据库连接错误的方法,并配有示例代码。

1. 连接过程及错误处理概述

在使用 C 语言连接 MySQL 数据库时,主要使用 mysql_init() 函数初始化 MySQL 连接对象,然后使用 mysql_real_connect() 函数尝试建立与数据库的连接。这两个函数都可能出现错误,需要进行相应的错误处理。

2. 具体错误处理方法

2.1 mysql_init() 函数错误处理

mysql_init() 函数用于初始化一个 MySQL 连接对象,如果初始化失败,会返回 NULL。可以通过检查返回值来判断是否初始化成功。

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

int main() {
    MYSQL *conn = mysql_init(NULL);
    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed: Memory allocation error\n");
        return 1;
    }
    // 后续连接操作
    // ...
    mysql_close(conn);
    return 0;
}

在上述代码中,如果 mysql_init() 返回 NULL,说明内存分配失败,程序会输出错误信息并退出。

2.2 mysql_real_connect() 函数错误处理

mysql_real_connect() 函数用于建立与 MySQL 数据库的连接,如果连接失败,会返回 NULL。可以使用 mysql_error() 函数获取具体的错误信息。

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

int main() {
    MYSQL *conn = mysql_init(NULL);
    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed: Memory allocation error\n");
        return 1;
    }

    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

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

    mysql_close(conn);
    return 0;
}

在上述代码中,如果 mysql_real_connect() 返回 NULL,说明连接失败,程序会使用 mysql_error() 函数获取错误信息并输出,然后关闭连接并退出。

2.3 常见错误及处理建议
  • 网络问题:如果错误信息提示无法连接到数据库服务器,可能是网络问题。可以检查数据库服务器的 IP 地址和端口号是否正确,以及网络是否正常。
  • 用户名或密码错误:如果错误信息提示认证失败,可能是用户名或密码错误。可以检查用户名和密码是否正确。
  • 数据库不存在:如果错误信息提示数据库不存在,可能是指定的数据库名错误。可以检查数据库名是否正确。

3. 更完善的错误处理示例

以下是一个更完善的示例,包含了重试机制和详细的错误处理:

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

#define MAX_RETRIES 3

int main() {
    MYSQL *conn = mysql_init(NULL);
    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed: Memory allocation error\n");
        return 1;
    }

    int retries = 0;
    while (retries < MAX_RETRIES) {
        if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) != NULL) {
            printf("Connected to MySQL successfully!\n");
            // 执行数据库操作
            // ...
            mysql_close(conn);
            return 0;
        }

        fprintf(stderr, "mysql_real_connect() failed (attempt %d/%d): %s\n", retries + 1, MAX_RETRIES, mysql_error(conn));
        retries++;
        if (retries < MAX_RETRIES) {
            // 等待一段时间后重试
            sleep(2);
        }
    }

    fprintf(stderr, "Failed to connect to MySQL after %d attempts.\n", MAX_RETRIES);
    mysql_close(conn);
    return 1;
}

在上述代码中,使用了一个重试机制,当连接失败时,会尝试重新连接,最多重试 MAX_RETRIES 次,每次重试之间等待 2 秒。如果多次重试后仍然失败,程序会输出错误信息并退出。

通过以上方法,可以在 C 语言中有效地处理 MySQL 数据库连接错误,提高程序的健壮性。

如何在C语言中优化MySQL数据库操作的性能?

在 C 语言中优化 MySQL 数据库操作的性能可以从多个方面入手,下面将从数据库连接管理、SQL 语句优化、数据处理与传输优化以及使用预处理语句等方面详细介绍:

1. 数据库连接管理

1.1 减少连接建立与关闭次数

频繁地建立和关闭数据库连接会带来较大的开销,因此应尽量复用已有的连接。可以采用连接池的思想,在程序启动时建立一定数量的数据库连接,后续操作从连接池中获取连接,使用完毕后归还连接,而不是每次操作都重新建立连接。

以下是一个简单的连接复用示例:

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

MYSQL *conn;

void init_connection() {
    conn = mysql_init(NULL);
    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return;
    }
    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return;
    }
}

void close_connection() {
    mysql_close(conn);
}

int main() {
    init_connection();
    // 执行多次数据库操作
    const char *query1 = "SELECT * FROM your_table";
    if (mysql_query(conn, query1) != 0) {
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
    }
    const char *query2 = "INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2')";
    if (mysql_query(conn, query2) != 0) {
        fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
    }
    close_connection();
    return 0;
}
1.2 合理设置连接超时时间

mysql_real_connect 函数中可以设置连接超时时间,避免长时间等待无响应的连接请求。

c 复制代码
MYSQL *conn = mysql_init(NULL);
if (conn != NULL) {
    mysql_options(conn, MYSQL_OPT_CONNECT_TIMEOUT, &(unsigned int){5}); // 设置连接超时时间为 5 秒
    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
    }
}

2. SQL 语句优化

2.1 避免使用 SELECT *

只选择需要的列,减少数据传输量和数据库处理开销。例如:

c 复制代码
const char *query = "SELECT column1, column2 FROM your_table WHERE condition";
if (mysql_query(conn, query) != 0) {
    fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
}
2.2 合理使用索引

在数据库表中为经常用于查询条件、排序和连接的列创建索引,能显著提高查询速度。在 C 语言代码中,确保 SQL 查询语句能够利用这些索引。例如,如果 your_table 表的 column1 列上有索引,查询时使用该列作为条件:

c 复制代码
const char *query = "SELECT column1, column2 FROM your_table WHERE column1 = 'value'";
if (mysql_query(conn, query) != 0) {
    fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
}
2.3 批量操作

对于插入、更新和删除操作,尽量使用批量操作。例如,批量插入数据:

c 复制代码
const char *query = "INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2'), ('value3', 'value4')";
if (mysql_query(conn, query) != 0) {
    fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
}

3. 数据处理与传输优化

3.1 减少不必要的数据传输

在查询数据时,根据实际需求进行过滤和排序,避免将大量不必要的数据从数据库传输到应用程序。例如,使用 LIMIT 关键字限制返回的记录数:

c 复制代码
const char *query = "SELECT column1, column2 FROM your_table WHERE condition LIMIT 10";
if (mysql_query(conn, query) != 0) {
    fprintf(stderr, "mysql_query() failed: %s\n", mysql_error(conn));
}
3.2 优化数据类型

在数据库表设计时,选择合适的数据类型,避免使用过大的数据类型,以减少数据存储和传输的开销。在 C 语言中,正确处理不同的数据类型,避免数据类型转换带来的性能损失。

4. 使用预处理语句

预处理语句可以减少 SQL 语句的解析和编译次数,提高多次执行相同结构 SQL 语句的性能。以下是一个使用预处理语句插入数据的示例:

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

int main() {
    MYSQL *conn = mysql_init(NULL);
    if (conn == NULL) {
        fprintf(stderr, "mysql_init() failed\n");
        return 1;
    }
    if (mysql_real_connect(conn, "localhost", "your_username", "your_password", "your_database", 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() failed: %s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }

    MYSQL_STMT *stmt = mysql_stmt_init(conn);
    if (stmt == NULL) {
        fprintf(stderr, "mysql_stmt_init() failed\n");
        mysql_close(conn);
        return 1;
    }

    const char *query = "INSERT INTO your_table (column1, column2) VALUES (?, ?)";
    if (mysql_stmt_prepare(stmt, query, strlen(query)) != 0) {
        fprintf(stderr, "mysql_stmt_prepare() failed: %s\n", mysql_stmt_error(stmt));
        mysql_stmt_close(stmt);
        mysql_close(conn);
        return 1;
    }

    MYSQL_BIND bind[2];
    memset(bind, 0, sizeof(bind));

    char value1[20] = "test_value1";
    char value2[20] = "test_value2";

    bind[0].buffer_type = MYSQL_TYPE_STRING;
    bind[0].buffer = value1;
    bind[0].buffer_length = strlen(value1);

    bind[1].buffer_type = MYSQL_TYPE_STRING;
    bind[1].buffer = value2;
    bind[1].buffer_length = strlen(value2);

    if (mysql_stmt_bind_param(stmt, bind) != 0) {
        fprintf(stderr, "mysql_stmt_bind_param() failed: %s\n", mysql_stmt_error(stmt));
        mysql_stmt_close(stmt);
        mysql_close(conn);
        return 1;
    }

    if (mysql_stmt_execute(stmt) != 0) {
        fprintf(stderr, "mysql_stmt_execute() failed: %s\n", mysql_stmt_error(stmt));
    }

    mysql_stmt_close(stmt);
    mysql_close(conn);
    return 0;
}

通过上述方法,可以在 C 语言中有效地优化 MySQL 数据库操作的性能。

最后

以上是 V 哥整理的在 C 语言开发中,操作 MySQL 数据库的案例讲解,希望可以帮助大家在学习 C 语言时能够快速上手,关注威哥爱编程,全栈开发就你行。

相关推荐
tan180°6 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
学不动CV了7 小时前
ARM单片机启动流程(二)(详细解析)
c语言·arm开发·stm32·单片机·51单片机
DuelCode7 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
幽络源小助理7 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
猫猫的小茶馆8 小时前
【STM32】通用定时器基本原理
c语言·stm32·单片机·嵌入式硬件·mcu·51单片机
爬山算法9 小时前
MySQL(116)如何监控负载均衡状态?
数据库·mysql·负载均衡
pumpkin8451410 小时前
Rust 调用 C 函数的 FFI
c语言·算法·rust
2401_8582861111 小时前
125.【C语言】数据结构之归并排序递归解法
c语言·开发语言·数据结构·算法·排序算法·归并排序
双叶83611 小时前
(C++)学生管理系统(正式版)(map数组的应用)(string应用)(引用)(文件储存的应用)(C++教学)(C++项目)
c语言·开发语言·数据结构·c++
is081513 小时前
STM32的 syscalls.c 和 sysmem.c
c语言·stm32·嵌入式硬件