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

news2024/11/15 8:27:19

目录

引言

一. 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为理解数据库操作的细节提供了宝贵的视角。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea git 重新登录

&#xff08;切换本地项目绑定的git账户&#xff09; git config --system --unset credential.helper git config user.name git pull &#xff08;然后输入用户名&#xff08;输绑定邮箱&#xff09;&#xff0c;密码&#xff09;

easyExcel2.1.6自动trim()的问题

环境&#xff1a;easyExcel 2.1.6 问题&#xff1a;easyExcel会自动忽略String中的空格&#xff0c;调用trim()函数&#xff0c;导致excel中的空格失效。 代码如上所示&#xff0c;所以只需要把globalConfiguration的autoTrim()&#xff0c;设置为false即可 那么怎么设置confi…

stable diffusion学习(1)成功打开WEBUI

建议学习github上的资源 GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 1.下载安装sd.webui.zip 1.1 Release v1.0.0-pre AUTOMATIC1111/stable-diffusion-webui GitHub 1.2安装python&#xff0c;设置阿里镜像 python -m pip config set gl…

Linux桥转发经过的netfilter钩子点

你是否也有这样的疑问&#xff0c;当我们路由器局域内的下挂设备&#xff0c;是怎么互相访问的呢。假设我的路由器当前的网段是192.168.1.1&#xff0c;有一台PC有线接入&#xff0c;IP地址为 192.168.1.142 &#xff0c;一台手机WiFi接入&#xff0c;IP地址为192.168.1.223&am…

FRTIMP_YTFRB_WEB

FRTIMP_YTFRB_WEB 林业资源交易信息管理平台

基于深度生物学引导辅助学习的多模态数据整合和插补来改进基因型-表型预测

DeepGAMI: deep biologically guided auxiliary learning for multimodal integration and imputation to improve genotype–phenotype prediction 代码&#xff1a;https://github.com/daifengwanglab/DeepGAMI abstract&#xff1a; background&#xff1a;基因型与疾病表…

【数据结构之C语言实现栈】

1.栈 的 概 念 与 结 构 栈&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据的插入和删除操作的一端称为栈顶&#xff0c;另一…

【代码随想录训练营第42期 Day26打卡 贪心Part1 - LeetCode 455.分发饼干 376. 摆动序列 53. 最大子序和

目录 一、贪心 二、题目与题解 题目一&#xff1a;455.分发饼干 题目链接 题解&#xff1a;排序双指针贪心 题目二&#xff1a;376. 摆动序列 题目链接 题解&#xff1a;贪心 题目三&#xff1a;53. 最大子序和 题目链接 题解1&#xff1a;暴力&#xff08;失败&…

立体相机镜面重建(二)双目立体镜面重建

使用双目相机&#xff0c;配合镜子、屏幕&#xff0c;可以直接获得镜面的三维数据&#xff0c;无需先验知识。因此使用双目镜面重建方式对镜子表面进行重建。 &#xff08;一&#xff09;重建步骤 使用左相机光线法来计算镜面点&#xff1a; 1.取一个像素点&#xff0c;计算其…

linux中安装达梦DM8

目录 场景&#xff1a; 安装准备 安装 新建 dmdba 用户 修改文件打开最大数 创建实例保存目录、归档保存目录、备份保存目录。 挂载镜像&#xff0c;命令行安装 ​编辑 配置环境变量 配置实例-命令行方式初始化实例 命令行注册服务 命令行启停数据库 数据库连接测试…

计算机网络部分基础知识

网络协议的意义 单台主机内部的设备之间需要发送和接收消息&#xff0c;那么和相隔很远的两台主机之间发送消息有什么区别呢&#xff1f;两台主机通过网络发送消息&#xff0c;相当于两个网卡设备之间进行通信&#xff0c;最大的区别在于距离变长了。而距离变长带来的结果就是&…

Gartner发布中国MDR托管检测和响应服务市场指南:中国不同类型的机构对MDR的需求对比

中国企业正越来越多地受益于提供现代安全运营中心功能的托管检测和响应服务。中国首席信息官和安全领导者应利用这项研究来了解中国的托管检测和响应市场及其动态。 主要发现 根据 CYBERSECURITY REVIEWS 的《2023 年中国网络安全运营市场研究报告》&#xff0c;超过 97%的中国…

【数据结构】六、图:4.图的遍历(深度优先算法DFS、广度优先算法BFS)

三、基本操作 文章目录 三、基本操作1.图的遍历1.1 深度优先遍历DFS1.1.1 DFS算法1.1.2 DFS算法的性能分析1.1.3 深度优先的生成树和生成森林 1.2 广度优先遍历BFS1.2.1 BFS算法1.2.2 BFS算法性能分析1.2.3 广度优先的生成树和生成森林 1.3 图的遍历与图的连通性 1.图的遍历 图…

synergy A problem occurred during installation, try installing.

系统&#xff1a;macos m2 解决方式&#xff1a; 在 ~/Library/LaunchAgents/ 目录下, 新建 com.symless.synergy3.plist 文件&#xff0c;并chown为当前用户。初始化成功

Latex或者word里面mathtype类型的数学公式如何变成mathematica里面的形式

详细步骤如下&#xff1a; 第一步&#xff1a;Latex里面的公式复制粘贴到word里面&#xff0c;转变成mathtype类型的数学公式&#xff08;若已经是word里面mathtype类型的数学公式&#xff0c;这一步可以省略&#xff09;&#xff0c;如下&#xff1a; 第二步&#xff1a;将ma…

探索SD NAND配套测试工具:工程师的得力助手

在快速发展的存储技术领域&#xff0c;SD NAND因其高速读写、低功耗和高可靠性而广受青睐。然而&#xff0c;对于工程师来说&#xff0c;验证SD NAND的性能并非易事&#xff0c;为了便于工程师验证&#xff0c;MK 米客方德开发设计了SD NAND配套测试工具。 一、SD NAND转接板简…

深度学习-----------------多个输入和输出通道

目录 多个输入通道多个输出通道多个输入和输出通道11卷积层二维卷积层总结多输入多输出通道代码实现多输入单输出通道代码实现多输出通道代码实现该部分代码 多输入多输出通道总代码多个输入和输出通道用途 11卷积该部分总代码 问题 多个输入通道 彩色图像可能有RGB三个通道 转…

【AWS账号解绑关联】Linker账号解绑重新关联注意事项

文章目录 一、来自客户疑问二、提交工单获取帮助三、最佳操作说明四、最佳操作步骤五、参考资料活动上新 一、来自客户疑问 将Linker账号&#xff0c;从一个组织中退出&#xff0c;重新关联到新的组织中&#xff0c;这解绑到重新完成新的关联绑定期间会在Linker账号中的账单中…

Markdown编写及语法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Linux 驱动入门(2)—— LED驱动

目录 前言 一、编译替换内核和设备树 二、GPIO子系统 1.引脚编号 2.基于sysfs操作引脚 3.GPIO子系统的函数 三、LED驱动编写 前言 在这里主要记录学习韦东山老师Linux驱动课程的笔记&#xff0c;韦东山老师的驱动课程讲的非常好&#xff0c;想要学习驱动的小伙伴可以去…