MYSQL C API 常用函数详解

一、一般常用函数

1.函数

1)MYSQL *mysql_init()

  初始化MySQL库,创建一个MySQL对象,用于后续的数据库连接和操作。

    • 返回值:一个指向新创建的MySQL对象的指针。
    • 参数:无

2)MYSQL *mysql_real_connect()

  连接到MySQL服务器,建立与数据库的通信连接。

    • 返回值:一个指向MySQL连接的指针,如果连接失败则返回NULL。
    • 参数:
      • MYSQL *mysql:mysql_init() 返回的MySQL对象。
      • const char *host:MySQL服务器主机名或IP地址。
      • const char *user:数据库用户的用户名。
      • const char *passwd:数据库用户的密码。
      • const char *db:要连接的数据库名称。
      • unsigned int port:MySQL服务器端口号。
      • const char *unix_socket:UNIX套接字文件路径(如果使用UNIX域套接字连接)。

3)int mysql_query()

  执行SQL查询。

    • 返回值:0表示成功,非零值表示失败。
    • 参数:
      • MYSQL *mysql:已建立的MySQL连接。
      • const char *query:要执行的SQL查询语句。

4)MYSQL_RES *mysql_store_result()

  将查询结果存储在内存中以供后续处理。

    • 返回值:一个指向查询结果集的指针。
    • 参数:MYSQL *mysql 已建立的MySQL连接。

5)MYSQL_ROW mysql_fetch_row()

  从查询结果集中获取一行数据。

    • 返回值:一个指向结果集中当前行的数据的指针数组。
    • 参数:MYSQL_RES *result 查询结果集。

6)unsigned int mysql_num_fields()

  获取结果集中的字段数。

    • 返回值:结果集中的字段数。
    • 参数:MYSQL_RES *result 查询结果集。

7)my_ulonglong mysql_num_rows()

  获取结果集中的行数。

    • 返回值:结果集中的行数。
    • 参数:MYSQL_RES *result 查询结果集。

8)void mysql_free_result()

  释放查询结果集资源,释放内存。

    • 参数:MYSQL_RES *result 查询结果集。

9)void mysql_close()

  关闭MySQL连接。

  • 参数:MYSQL *mysql:要关闭的MySQL连接。

10)const char *mysql_error()

  获取最后一次MySQL操作的错误信息。

    • 返回值:一个指向错误消息字符串的指针。
    • 参数:无

11)my_ulonglong mysql_affected_rows()

 用于确定前一次更改数据库时影响了多少行。

    • 返回值:受上一次INSERT、UPDATE或DELETE操作影响的行数。
    • 参数:MYSQL *mysql:已建立的MySQL连接。

12)unsigned long mysql_real_escape_string()

  对字符串进行SQL转义,以防止SQL注入攻击。

    • 返回值:已转义的字符串的长度。
    • 参数:
      • MYSQL *mysql:已建立的MySQL连接。
      • char *to:目标缓冲区,用于存储转义后的字符串。
      • const char *from:要转义的原始字符串。
      • unsigned long length:要转义的原始字符串的长度。

13)unsigned long *mysql_fetch_lengths()

  获取结果集中每个字段值的长度,通常用于处理返回的数据。

    • 返回值:一个指向包含结果集中每个字段值长度的数组的指针。
    • 参数:
      • MYSQL_RES *result:查询结果集。

14)int mysql_ping()

  检查MySQL服务器是否仍然可用,可以用于维护连接的健康状态。

    • 返回值:0表示成功,非零值表示失败。
    • 参数:MYSQL *mysql:已建立的MySQL连接。

2.使用示例

#include <mysql/mysql.h>  // 包含MySQL C API头文件

int main() {
    MYSQL *mysql = mysql_init(NULL);  // 初始化MySQL库,创建MySQL对象

    if (mysql == NULL) {
        fprintf(stderr, "mysql_init() 失败\n");
        return 1;
    }

    if (mysql_real_connect(mysql, "localhost", "username", "password", "mydatabase", 3306, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() 失败: %s\n", mysql_error(mysql));
        mysql_close(mysql);
        return 1;
    }

    if (mysql_query(mysql, "SELECT * FROM mytable")) {  // 执行SQL查询
        fprintf(stderr, "mysql_query() 失败: %s\n", mysql_error(mysql));
        mysql_close(mysql);
        return 1;
    }

    MYSQL_RES *result = mysql_store_result(mysql);  // 存储查询结果

    if (result == NULL) {
        fprintf(stderr, "mysql_store_result() 失败: %s\n", mysql_error(mysql));
        mysql_close(mysql);
        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");
    }

    int num_rows = mysql_num_rows(result);  // 获取结果集中的行数
    printf("总共 %d 行数据\n", num_rows);

    mysql_free_result(result);  // 释放结果集资源
    mysql_close(mysql);  // 关闭MySQL连接

    return 0;
}

 

二、预编译SQL相关函数

1.函数

1)MYSQL_STMT *mysql_stmt_init()

  初始化MySQL预处理语句,用于执行多次相似的查询。

    • 返回值:一个指向新创建的MySQL预处理语句对象的指针。
    • 参数:
      • MYSQL *mysql:已建立的MySQL连接。

2)int mysql_stmt_prepare()

  准备MySQL预处理语句,绑定SQL语句以供后续执行。

    • 返回值:0表示成功,非零值表示失败。
    • 参数:
      • MYSQL_STMT *stmt:预处理语句对象。
      • const char *query:要执行的SQL查询语句。

3)int mysql_stmt_bind_param()

  将参数绑定到预处理语句中的占位符。

    • 返回值:0表示成功,非零值表示失败。
    • 参数:
      • MYSQL_STMT *stmt:预处理语句对象。
      • MYSQL_BIND *bind:一个指向MYSQL_BIND结构的数组,包含要绑定的参数信息。

4)int mysql_stmt_bind_result()

  用于绑定输出参数到预编译的 SQL 语句中,以接收查询结果。

  • 返回值:0 表示成功,非零值表示失败。
  • 参数:
    • MYSQL_STMT *stmt:预处理语句对象。
    • MYSQL_BIND *bind:一个指向MYSQL_BIND结构的数组,用于绑定查询结果的输出参数。

5)int mysql_stmt_execute()

  执行MySQL预处理语句。

    • 返回值:0表示成功,非零值表示失败。
    • 参数:
      • MYSQL_STMT *stmt:要执行的预处理语句对象。

6)int mysql_stmt_store_result()

  将预处理语句的结果存储在内存中以供后续处理。

    • 返回值:0表示成功,非零值表示失败。
    • 参数:
      • MYSQL_STMT *stmt:预处理语句对象。

7)int mysql_stmt_fetch()

  从预处理语句的结果集中获取一行数据。

    • 返回值类型:int
    • 返回值:0表示成功获取一行数据,1表示到达结果集的末尾,非零值表示失败。
    • 参数:
      • MYSQL_STMT *stmt:预处理语句对象。

8)int mysql_stmt_close()

  用于关闭预处理语句,释放相关资源。

  • 返回值:0 表示成功,非零值表示失败。
  • 参数:
    • MYSQL_STMT *stmt:要关闭的预处理语句对象。

2.使用示例 

#include <mysql/mysql.h>  // 包含MySQL C API头文件

int main() {
    MYSQL *mysql = mysql_init(NULL);  // 初始化MySQL库,创建MySQL对象

    if (mysql == NULL) {
        fprintf(stderr, "mysql_init() 失败\n");
        return 1;
    }

    if (mysql_real_connect(mysql, "localhost", "username", "password", "mydatabase", 3306, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() 失败: %s\n", mysql_error(mysql));
        mysql_close(mysql);
        return 1;
    }

    MYSQL_STMT *stmt = mysql_stmt_init(mysql);  // 初始化MySQL语句句柄

    if (stmt == NULL) {
        fprintf(stderr, "mysql_stmt_init() 失败\n");
        mysql_close(mysql);
        return 1;
    }

    const char *sql = "SELECT name, age FROM people WHERE id=?";
    if (mysql_stmt_prepare(stmt, sql, strlen(sql))) {  // 准备SQL语句
        fprintf(stderr, "mysql_stmt_prepare() 失败: %s\n", mysql_error(mysql));
        mysql_stmt_close(stmt);
        mysql_close(mysql);
        return 1;
    }

    int id = 1;  // 用于绑定的参数
    MYSQL_BIND input_bind;
    memset(&input_bind, 0, sizeof(input_bind));
    input_bind.buffer_type = MYSQL_TYPE_LONG;
    input_bind.buffer = &id;
    input_bind.is_null = 0;
    input_bind.length = 0;

    if (mysql_stmt_bind_param(stmt, &input_bind)) {  // 绑定输入参数
        fprintf(stderr, "mysql_stmt_bind_param() 失败: %s\n", mysql_error(mysql));
        mysql_stmt_close(stmt);
        mysql_close(mysql);
        return 1;
    }

    if (mysql_stmt_execute(stmt)) {  // 执行预编译的SQL语句
        fprintf(stderr, "mysql_stmt_execute() 失败: %s\n", mysql_error(mysql));
        mysql_stmt_close(stmt);
        mysql_close(mysql);
        return 1;
    }

    MYSQL_BIND result_bind[2];  // 用于绑定查询结果的输出参数
    memset(result_bind, 0, sizeof(result_bind));
    
    char name[50];
    int age;

    result_bind[0].buffer_type = MYSQL_TYPE_STRING;
    result_bind[0].buffer = name;
    result_bind[0].buffer_length = sizeof(name);
    result_bind[0].is_null = 0;

    result_bind[1].buffer_type = MYSQL_TYPE_LONG;
    result_bind[1].buffer = &age;
    result_bind[1].is_null = 0;
    result_bind[1].length = 0;

    if (mysql_stmt_bind_result(stmt, result_bind)) {  // 绑定输出参数
        fprintf(stderr, "mysql_stmt_bind_result() 失败: %s\n", mysql_error(mysql));
        mysql_stmt_close(stmt);
        mysql_close(mysql);
        return 1;
    }

    while (mysql_stmt_fetch(stmt) == 0) {  // 逐行获取查询结果
        printf("Name: %s, Age: %d\n", name, age);
    }

    mysql_stmt_close(stmt);  // 关闭预编译的SQL语句句柄
    mysql_close(mysql);  // 关闭MySQL连接

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值