深入探索MySQL C API:使用C语言操作MySQL数据库

目录

引言

一. MySQL C API简介

二. MySQL C API核心函数

2.1 初始化和连接

2.2 配置和执行

2.3 处理结果

2.4 清理和关闭

2.5 错误处理

三. MySQL使用过程

四. 实现CRUD操作

4.1 创建数据库并建立表

​编辑

4.2 添加数据(Create)

​编辑

​编辑

​编辑4.3 修改数据(Update)

​编辑

4.4 删除数据(Delete)

4.5 查询数据(Retrieve)

结语


引言

在软件开发中,数据库是存储、检索和操作数据的关键组件。MySQL作为一种广泛使用的数据库系统,提供了丰富的API接口,允许开发者通过不同的编程语言与其交互。本文将详细介绍如何使用MySQL的C语言API来实现数据库的基本增删改查(CRUD)操作。

一. MySQL C API简介

MySQL C API是一组函数,它们提供了对MySQL服务器的底层访问。通过这个API,开发者可以在C语言程序中执行SQL语句并处理结果。

二. MySQL C API核心函数

// Mysql操作句柄初始化
MYSQL *mysql_init(MYSQL *mysql);
// 参数为空则动态申请句柄空间进⾏初始化
//  失败返回NULL

// 连接mysql服务器
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
                          const char *passwd, const char *db, unsigned int port,
                          const char *unix_socket, unsigned long client_flag);
// mysql--初始化完成的句柄
// host---连接的mysql服务器的地址
// user---连接的服务器的⽤⼾名
// passwd-连接的服务器的密码
// db ----默认选择的数据库名称
// port---连接的服务器的端⼝: 默认0是3306端⼝
// unix_socket---通信管道⽂件或者socket⽂件,通常置NULL
// client_flag---客⼾端标志位,通常置0
// 返回值:成功返回句柄,失败返回NULL

// 设置当前客⼾端的字符集
int mysql_set_character_set(MYSQL *mysql, const char *csname)
    // mysql--初始化完成的句柄
    // csname--字符集名称,通常:"utf8"
    // 返回值:成功返回0, 失败返回⾮0;

// 选择操作的数据库
int mysql_select_db(MYSQL *mysql, const char *db)
    // mysql--初始化完成的句柄
    // db-----要切换选择的数据库名称
    // 返回值:成功返回0, 失败返回⾮0;

// 执⾏sql语句
int mysql_query(MYSQL *mysql, const char *stmt_str)
    // mysql--初始化完成的句柄
    // stmt_str--要执⾏的sql语句
    // 返回值:成功返回0, 失败返回⾮0;

// 保存查询结果到本地
MYSQL_RES *mysql_store_result(MYSQL *mysql)
    // mysql--初始化完成的句柄
    // 返回值:成功返回结果集的指针, 失败返回NULL;

// 获取结果集中的⾏数与列数
uint64_t mysql_num_rows(MYSQL_RES *result);
    //result--保存到本地的结果集地址
    // 返回值:结果集中数据的条数;

// 获取结果中列的个数
unsigned int mysql_num_fields(MYSQL_RES *result)
    // result--保存到本地的结果集地址
    // 返回值:结果集中每⼀条数据的列数;

// 遍历结果集
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
    // result--保存到本地的结果集地址
    // 返回值:实际上是⼀个char **的指针,将每⼀条数据做成了字符串指针数组 row[0]-第0列row[1] -第1列
    // 并且这个接⼝会保存当前读取结果位置,每次获取的都是下⼀条数据

// 释放结果集
void mysql_free_result(MYSQL_RES *result)
    // result--保存到本地的结果集地址
    // 返回值:void

// 关闭数据库客⼾端连接,销毁句柄:
void mysql_close(MYSQL *mysql)

// 获取mysql接⼝执⾏错误原因
const char *mysql_error(MYSQL *mysql)

2.1 初始化和连接

  • mysql_init:初始化MySQL操作句柄。
  • mysql_real_connect:使用给定的参数连接到MySQL服务器。

2.2 配置和执行

  • mysql_set_character_set:设置客户端字符集。
  • mysql_select_db:选择要操作的数据库。
  • mysql_query:执行SQL语句。

2.3 处理结果

  • mysql_store_result:保存查询结果到本地。
  • mysql_num_rowsmysql_num_fields:获取结果集中的行数和列数。
  • mysql_fetch_row:遍历结果集,获取单行数据。

2.4 清理和关闭

  • mysql_free_result:释放结果集资源。
  • mysql_close:关闭数据库连接,销毁句柄。

2.5 错误处理

  • mysql_error:获取MySQL接口执行错误原因。

三. MySQL使用过程

  • 初始化MySQL句柄

    • 使用mysql_init函数初始化一个MySQL连接句柄,为后续操作做准备。
  • 连接到MySQL服务器

    • 使用mysql_real_connect函数连接到MySQL服务器,需要提供主机地址、用户名、密码、数据库名等信息。
  • 设置字符集

    • 使用mysql_set_character_set设置客户端字符集,以确保字符编码的一致性。
  • 执行SQL语句

    • 使用mysql_query执行SQL语句,可以是查询、插入、更新或删除等操作。
  • 处理查询结果(对于查询操作):

    • 如果执行的是查询操作,可以使用mysql_store_result保存结果集,然后通过mysql_fetch_row逐行读取数据。
  • 错误处理

    • 在每个步骤中,如果操作失败,可以使用mysql_error获取错误信息。
  • 清理资源

    • 使用完MySQL句柄后,使用mysql_free_result释放结果集资源(如果有查询操作),然后使用mysql_close关闭连接,释放句柄资源。
  • 关闭连接

    • 最后,关闭与MySQL服务器的连接,清理分配的资源。

四. 实现CRUD操作

4.1 创建数据库并建立表

create database if not exists test_db;
use test_db;
create table if not exists test_tb(
 id int primary key auto_increment,
 age int,
 name varchar(32),
 score decimal(4, 2)
);

4.2 添加数据(Create)

使用insert语句向数据库表中添加新记录。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <mysql/mysql.h>
#define HOST "127.0.0.1"
#define USER "root"
#define PASSWD "mima"
#define DBNAME "test_db"
void add(MYSQL *mysql)
{
    char *sql = "insert into test_tb values(null, 18, '张三', 88.88), (null, 17, '李四', 77);";
    int ret = mysql_query(mysql, sql);
    if (ret != 0)
    {
        printf("mysql query error:%s\n", mysql_error(mysql));
        return;
    }
    return;
}

int main()
{
    MYSQL *mysql = mysql_init(NULL);
    if (mysql == NULL)
    {
        printf("init mysql handle failed!\n");
        return -1;
    }
    if (mysql_real_connect(mysql, HOST, USER, PASSWD, DBNAME, 0, NULL, 0) ==
        NULL)
    {
        printf("mysql connect error:%s\n", mysql_error(mysql));
        return -1;
    }
    mysql_set_character_set(mysql, "utf8");
    add(mysql);
    mysql_close(mysql);
    return 0;
}

编译并运行 +运行结果

4.3 修改数据(Update)

使用update语句更新表中的现有记录。

void mod(MYSQL *mysql)
{
    char *sql = "update test_tb set age=34 where name='张三';";
    int ret = mysql_query(mysql, sql);
    if (ret != 0)
    {
        printf("mysql query error:%s\n", mysql_error(mysql));
        return;
    }
    return;
}

运行结果

4.4 删除数据(Delete)

使用delete语句从表中删除记录。

void del(MYSQL *mysql)
{
    char *sql = "delete from test_tb where name='张三';";
    int ret = mysql_query(mysql, sql);
    if (ret != 0)
    {
        printf("mysql query error:%s\n", mysql_error(mysql));
        return;
    }
    return;
}

运行结果

4.5 查询数据(Retrieve)

使用select语句检索表中的数据。

void get(MYSQL *mysql)
{
    char *sql = "select * from test_tb;";
    int ret = mysql_query(mysql, sql);
    if (ret != 0)
    {
        printf("mysql query error:%s\n", mysql_error(mysql));
        return;
    }
    MYSQL_RES *res = mysql_store_result(mysql);
    if (res == NULL)
    {
        printf("mysql store result error:%s\n", mysql_error(mysql));
        return;
    }
    int row = mysql_num_rows(res);
    int col = mysql_num_fields(res);
    printf("%10s%10s%10s%10s\n", "ID", "年龄", "姓名", "成绩");
    for (int i = 0; i < row; i++)
    {
        MYSQL_ROW row_data = mysql_fetch_row(res);
        for (int i = 0; i < col; i++)
        {
            printf("%10s", row_data[i]);
        }
        printf("\n");
    }
    mysql_free_result(res);
    return;
}

运行结果

结语

通过本文的介绍,你应该对MySQL的C语言API有了深入的了解。使用这些API,你可以在C语言项目中实现对MySQL数据库的高效操作。虽然现代开发中更倾向于使用高级语言和ORM框架,但直接使用MySQL C API为理解数据库操作的细节提供了宝贵的视角。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值