第三方库认识- Mysql 数据库 API 认识
文章目录
- 一、msyql数据库API接口
- 1.初始化mysql_init()——mysql_init
- 2.链接数据库mysql_real_connect——mysql_real_connect
- 3.设置当前客户端的字符集——mysql_set_character_set
- 4.选择操作的数据库——mysql_select_db
- 5.执行sql语句——mysql_query
- 6.保存查询结果到本地——mysql_store_result
- 7.获取结果集中的行数与列数—— mysql_num_rows/mysql_num_fields
- 8.遍历结果集——mysql_fetch_row
- 9.释放结果集——mysql_free_result
- 10.关闭数据库客户端连接,销毁句柄——mysql_close
- 11.获取mysql接口执行错误原因——mysql_error
- 创建测试用库和表
- 使用API实现数据的增删改查操作
一、msyql数据库API接口
1.初始化mysql_init()——mysql_init
mysql_init API文档链接别点了,也没样例代码,反正我是看不懂。
要使用库,必须先进行初始化!
函数:
MYSQL *mysql_init(MYSQL *mysql);
- 参数为空则动态申请句柄空间进行初始化
- 失败返回NULL
样例:
2.链接数据库mysql_real_connect——mysql_real_connect
初始化完毕之后,必须先链接数据库,进行后续操作。(mysql网络部分是基于TCP/IP的)
函数:
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
3.设置当前客户端的字符集——mysql_set_character_set
函数:
int mysql_set_character_set(MYSQL *mysql, const char *csname)
- mysql–初始化完成的句柄
- csname–字符集名称,通常:“utf8”
- 返回值:成功返回0, 失败返回非0;
4.选择操作的数据库——mysql_select_db
函数:
int mysql_select_db(MYSQL *mysql, const char *db)
- mysql–初始化完成的句柄
- db-----要切换选择的数据库名称
- 返回值:成功返回0, 失败返回非0;
5.执行sql语句——mysql_query
函数:
int mysql_query(MYSQL *mysql, const char *stmt_str)
- mysql–初始化完成的句柄
- stmt_str–要执行的sql语句
- 返回值:成功返回0, 失败返回非0;
6.保存查询结果到本地——mysql_store_result
函数:
MYSQL_RES *mysql_store_result(MYSQL *mysql)
- mysql–初始化完成的句柄
- 返回值:成功返回结果集的指针, 失败返回NULL;
7.获取结果集中的行数与列数—— mysql_num_rows/mysql_num_fields
函数:
uint64_t mysql_num_rows(MYSQL_RES *result);
- result–保存到本地的结果集地址
- 返回值:结果集中数据的条数
函数:
unsigned int mysql_num_fields(MYSQL_RES *result)
- result–保存到本地的结果集地址
- 返回值:结果集中每一条数据的列数;
8.遍历结果集——mysql_fetch_row
函数:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
- result–保存到本地的结果集地址
- 返回值:实际上是一个char **的指针,将每一条数据做成了字符串指针数组 row[0]-第0列 row[1]-第1列
- 并且这个接口会保存当前读取结果位置,每次获取的都是下一条数据
9.释放结果集——mysql_free_result
函数:
void mysql_free_result(MYSQL_RES *result)
- result–保存到本地的结果集地址
- /返回值:void
10.关闭数据库客户端连接,销毁句柄——mysql_close
函数:
void mysql_close(MYSQL *mysql)
11.获取mysql接口执行错误原因——mysql_error
函数:
const char *mysql_error(MYSQL *mysql)
创建测试用库和表
库名:test_db
表名:test_tb{
id(int)
age(int)
name(varcher32)
score(decimal(4,2))
}
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)
);
使用API实现数据的增删改查操作
#include<iostream>
#include<mysql/mysql.h>
#include<string>
using namespace std;
int main()
{//1.操作句柄初始化,参数为空就动态申请句柄进行初始化MYSQL* mysql = mysql_init(NULL);if(mysql==NULL){cerr<<"init mysql handle failed"<<endl;return -1;}string host = "127.0.0.1";string user = "root";string passwd ="123456789.whC";string dp = "test_db";//2.链接数据库if( mysql_real_connect(mysql,host.c_str(),user.c_str(),passwd.c_str(),dp.c_str(),0,NULL,0)==NULL){cerr<<"mysql connect error "<<mysql_error(mysql)<<endl;return -1;}//3.设置字符集mysql_set_character_set(mysql,"utf8");//4.选择数据库int ret = mysql_select_db(mysql,"test_db");if(ret!=0){cerr<<"select db error"<<endl;}//增 // string sql = "insert into test_tb (age,name,score)values(18,'whc',12.33);"; // ret = mysql_query(mysql,sql.c_str());// if(ret!=0)// {// cerr<<"mysql query select error"<<endl;// }//改string sql1 ="update test_tb set age=100 where id=2;";ret = mysql_query(mysql,sql1.c_str());if(ret!=0){cerr<<"mysql query update error"<<endl;}string sql2 ="delete from test_tb where id =6;";//删// mysql_query(mysql,sql2.c_str());//查string sql3 ="select * from test_tb;";//执行语句ret = mysql_query(mysql,sql3.c_str());if(ret!=0){cerr<<"mysql query select error"<<endl;return -1;}//保存查询结果到本地MYSQL_RES* result = mysql_store_result(mysql);//获取结果集中的行数uint64_t row_nums = mysql_num_rows(result);//获取结果集中的列数unsigned int field_nums = mysql_num_fields(result);cout<<row_nums<<" "<<field_nums<<endl;//遍历结果集MYSQL_ROW row;for(int i = 0;i<row_nums;i++){row = mysql_fetch_row(result);for(int j = 0;j<field_nums;j++){cout<<row[j]<<" ";}cout<<endl;}//释放结果集mysql_free_result(result);//关闭数据库客户端连接,销毁句柄mysql_close(mysql);return 0;
}
相关文章:

第三方库认识- Mysql 数据库 API 认识
文章目录 一、msyql数据库API接口1.初始化mysql_init()——mysql_init2.链接数据库mysql_real_connect——mysql_real_connect3.设置当前客户端的字符集——mysql_set_character_set4.选择操作的数据库——mysql_select_db5.执行sql语句——mysql_query6.保存查询结果到本地——…...

Python兼职接单全攻略:掌握技能,拓宽收入渠道
引言 随着Python在数据处理、Web开发、自动化办公、爬虫技术等多个领域的广泛应用,越来越多的人开始利用Python技能进行兼职接单,以此拓宽收入渠道。本文将详细介绍Python兼职接单的注意事项、所需技能水平、常见单子类型、接单途径及平台,帮…...

一键编译并启动一个 ARM Linux qemu 虚拟机
需要事先自己编译 qemu-system-arm 可执行文件; 1,编译创建ARM 虚拟机 #!/usr/bin/bash sudo lssudo apt-get install gcc-arm-linux-gnueabi#wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.10.tar.gztar zxf linux-kernel-v5.10…...

KubeVirt虚拟机存储及网络卸载加速解决方案
1. 方案背景 1.1. KubeVirt介绍 随着云计算和容器技术的飞速发展,Kubernetes已成为业界公认的容器编排标准,为用户提供了强大、灵活且可扩展的平台来部署和管理各类应用。然而,在企业的实际应用中,仍有许多传统应用或遗留系统难…...

JVM—对象已死?
参考资料:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)周志明 在堆里面存放着 Java 世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”。 1、如何判…...

【前端面试3+1】20 css三栏布局6种实现方式、多行文本溢出怎么实现、token过期了怎么处理、【二叉树的中序遍历】
一、css三栏布局6种实现方式 1.浮动布局(Floats) .container {overflow: auto; /* 清除浮动 */ }.left, .right {width: 20%; /* 左右栏宽度 */float: left; }.middle {width: 60%; /* 中间栏宽度 */margin: 0 20%; /* 左右栏宽度 */ } 2.Flexbox .conta…...
【C++】vector介绍以及模拟实现(超级详细<=>源码并存)
欢迎来到我的Blog,点击关注哦💕 【C】vector介绍以及模拟实现 前言vector介绍 vector常见操作构造函数iteratorcapacitymodify vector模拟实现存储结构默认构造函数构造函数拷贝构造函数赋值运算符重载析构函数 容量(capacity)si…...

【Redis 进阶】主从复制(重点理解流程和原理)
在分布式系统中为了解决单点问题(某个服务器程序只有一个节点(只搞一个物理服务器来部署这个服务器程序)。可用性不高:如果这个机器挂了意味着服务就中断了;性能 / 支持的并发量比较有限)。通常会把数据复制…...

Git常用命
转自:https://blog.csdn.net/ahjxhy2010/article/details/80047553 1.查看某个文件或目录的修改历史 git log filename #查看fileName相关的commit记录 git log -p filenam # 显示每次提交的diff#只看某次提交中的某个文件变化,commit-id 文件名…...
强化学习时序差分算法之Q-learning算法——以悬崖漫步环境为例
0.简介 基于时序差分算法的强化学习算法除了Sarsa算法以外还有一种著名算法为Q-learning算法,为离线策略算法,与在线策略算法Sarsa算法相比,其时序差分更新方式变为 Q(St,At)←Q(St,At)α[Rt1γmaxaQ(St1,a)−Q(St,At)] 对于 Sarsa 来说&am…...
111推流111
推流推流...
刷题——数组中只出现一次的两个数字
数组中只出现一次的两个数字_牛客题霸_牛客网 描述 一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 数据范围:数组长度 2≤n≤10002≤n≤1000,数组中每个数的大小 0<val≤100000…...
《剖析程序员面试“八股文”:助力、阻力还是噱头?》
#“八股文”在实际工作中是助力、阻力还是空谈? 作为现在各类大中小企业面试程序员时的必问内容,“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢?有IT人士不禁发出疑问:程序员面试考…...
Redis过期key的删除策略
在 Redis 中,设置了过期时间的键在过期时间到达后,并不会立即从内存中删除。如果不是,那过期后到底什么时候被删除呢? 下面对这三种删除策略进行具体分析。 立即删除: 立即删除能够保证内存数据的及时性和空间的有效…...
软件管理
设备挂载在目录下才可以读 挂载类似于将u盘插在电脑上 mount /dev/sr0 /opt/openeuler/ vim /etc/rc.d/rc.local #开机自运行脚本,将挂载命令写入脚本,并给这个脚本执行权限 chmod x /etc/rc.d/rc.local [rootlocalhost ~]# cd /etc/yum.repos.d/ […...

【2024】Datawhale AI夏令营 Task3笔记——Baseline2部分代码解读及初步上分思路
【2024】Datawhale AI夏令营 Task3笔记——Baseline2部分代码解读及初步上分思路 本文对可完成赛事“逻辑推理赛道:复杂推理能力评估”初赛的Baseline2部分关键代码进行详细解读,介绍Baseline2涉及的关键技术和初步上分思路。 Baseline2代码由Datawhal…...

软件测试——测试分类(超超超齐全版)
为什么要对软件测试进行分类 软件测试是软件⽣命周期中的⼀个重要环节,具有较⾼的复杂性,对于软件测试,可以从不同的⻆度加以分类,使开发者在软件开发过程中的不同层次、不同阶段对测试⼯作进⾏更好的执⾏和管理测试的分类⽅法。…...

深入解析 Go 语言 GMP 模型:并发编程的核心机制
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:点击跳转到网站,对人工智能感兴趣的小伙伴可以点进去看看。 前言 本章是Go并发编程的起始篇章,在未来几篇文章中我们会…...
PHP中如何处理字符串
在PHP中,处理字符串是一项非常常见的任务,PHP提供了大量的内置函数来方便地处理字符串。以下是一些常用的字符串处理函数: strlen() - 返回字符串的长度。 php复制代码 $text "Hello, World!"; echo strlen($text); // 输出&…...

windows内存泄漏检查汇总
VLD(Visual Leak Detector) 下载 官方下载地址2.5 另一分支2.7 安装 点击运行安装...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...