数据库_之常用API的使用
数据库_之电商API
MySQL C API 使用(基本函数)
Mysql C API函数详解
MySQL的常用API
一个常用的程序调用MySQL数据库的时候通常都会调用以下API,下面来逐个分析.
-
mysql_init()
//函数原型 MYSQL *STDCALL mysql_init(MYSQL *mysql);
这个
API
主要是用来分配或初始化一个MySQL
对象,用来连接MySQL服务端; 返回值是MYSQL *
; 参数MYSQL *mysql
是指定一个MYSQL
对象. -
mysql_options()
//函数原型 int STDCALL mysql_options(MYSQL *mysql, enum mysql_option option,const void *arg);
此
API
可用于设置额外的连接选项,并影响连接的行为.本函数可多次调用来设置数个选项; 参数MYSQL *mysql
是指定一个MYSQL
对象; 参数enum mysql_option option
是供调用者选择填写的连接选项; 参数const void *arg
是结合上一个参数填写的连接选项的值.关于连接选项的填写,可以参考 mysql_options()函数
-
mysql_real_connect()
//函数原型 MYSQL *STDCALL 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 clientflag);
这个
API
主要是用来分配或初始化一个MySQL
对象,用来连接MySQL
服务端. 参数MYSQL *mysql
是指定一个MYSQL
对象,此处为mysql_init
函数返回的指针; 参数const char *host
指定主机地址; 参数const char *user
指定mysql
用户名; 参数const char *passwd
输入该用户名的密码; 参数const char *db
指定数据库,当该值为空时链接到默认的数据库; 参数unsigned int port
指定端口; 参数const char *unix_socket
指定使用unix链接方式,为空时表明不适用socket
或管道机制; 参数unsigned long clientflag
通常设置为0. -
mysql_query()
//函数原型 int STDCALL mysql_query(MYSQL *mysql, const char *q);
此
API
是最常用的,增删查改都使用到它,query
英文意思是查询,但这里表示执行
. 参数MYSQL *mysql
是指定一个MYSQL
对象. 参数const char *
输入一个SQL
语句. -
mysql_store_result()
//函数原型 MYSQL_RES *STDCALL mysql_store_result(MYSQL *mysql);
获取结果集,通常是搭配
mysql_query
这个API
来使用,查询上一条SQL
语句返回的结果. 参数MYSQL *mysql
是指定一个MYSQL
对象 返回值MYSQL_RES
是一个句柄,可以使用mysql_fetch_row
取出这个结果集里头有多少行数据. -
mysql_use_result()
//函数原型 MYSQL_RES *STDCALL mysql_use_result(MYSQL *mysql);
这个
API
是在调用一个可以产生结果集的命令之后,搭配本函数使用获取该结果集; 参数MYSQL *mysql
是指定一个MYSQL
对象. -
mysql_fetch_row()
//函数原型 MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
结合
mysql_store_result
这个API
来使用,获取每一行的内容. 参数MYSQL_RES *result
是通过mysql_use_result
获取到的返回值. -
mysql_free_result()
//函数原型 void STDCALL mysql_free_result(MYSQL_RES *result);
操作完结果集之后.一定要调用本函数来释放内存; 参数
MYSQL_RES *result
是通过mysql_use_result
获取到的返回值. -
mysql_error()
//函数原型 const char *STDCALL mysql_error(MYSQL *mysql);
函数返回值是
const char*
类型,主要是返回最近调用mysql
函数发生了哪些错误信息 参数MYSQL *mysql
是指定一个MYSQL
对象 -
mysql_close()
//函数原型 void STDCALL mysql_close(MYSQL *sock);
mysql_close()
是每个调用数据库连接的程序在最后阶段都必须要调用的, 很明显它的功能是用来关闭一个MySQL服务端的连接. 参数MYSQL *mysql
是指定一个MYSQL
对象
MySQL的API应用
下面使用一个比较实际的例子,用这些API
写一个简单的单机版数据库管理软件.
本地数据库新建好两个表并存入部分初始信息:
-
先定义好包含文件:
define.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <mysql.h>
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <assert.h>
#pragma comment(lib,"libmysql.lib")
- 定义一个管理类:
CManager
提供主菜单的显示,连接数据库和打印错误的功能.
CManager.h
#pragma once
#include "define.h"
#include "CWorker.h"
#include "CAdmin.h"
class CManager
{MYSQL m_sql;CWorker m_work;CAdmin m_admin;int Menu();bool ConnectDB();
public:int Main();static void PrintError(std::string sPromp){auto & sql = getInstance().m_sql;std::cout << sPromp << "(" << mysql_errno(&sql) << "):" << mysql_error(&sql) << std::endl;system("pause");}static CManager& getInstance(){static CManager m;return m;}CManager() : m_admin(m_sql),m_work(m_sql){}
};
CManager.cpp
#include "CManager.h"
using namespace std;
int CManager::Menu()
{system("cls");const char* sPrior = m_admin.GetPrior() ? "普通" : "高级";cout << "\n\n\t\t当前用户:" << m_admin.GetUser() << "【" << sPrior << "】" << endl;puts("\t\t********************************");puts("\t\t*\t1、浏览所有信息 *");puts("\t\t*\t2、添加信息 *");puts("\t\t*\t3、删除信息 *");puts("\t\t*\t4、修改信息 *");puts("\t\t*\t5、查找信息 *");if (m_admin.GetPrior())puts("\t\t*\t6、密码修改 *");elseputs("\t\t*\t6、管理账号 *");puts("\t\t*\t0、退出 *");puts("\t\t********************************");cout << "\t\t请选择:";int i = 0;cin >> i;switch (i)
相关文章:

数据库_之常用API的使用
数据库_之电商API MySQL C API 使用(基本函数) Mysql C API函数详解 MySQL的常用API 一个常用的程序调用MySQL数据库的时候通常都会调用以下API,下面来逐个分析. mysql_init() //函数原型 MYSQL *STDCALL mysql_init(MYSQL *mysql);这个API主要是用来分…...
CTreeCtrl自绘
CSWTreeCtrl.h) #pragma once#define _OWNER_DRAWN_TREE // 自绘CTreeCtrl,可支持背景图片显示功能class CSWTreeCtrl : public CTreeCtrl {DECLARE_DYNAMIC(CSWTreeCtrl)// 成员私有结构定义// 构造/析构函数 public:CSWTreeCtrl();virtual ~CSWTreeC…...
目标检测YOLO实战应用案例100讲-基于深度学习的可见光遥感图像目标检测
目录 前言 遥感图像目标的特点 基于深度学习的目标检测技术 2.1引言 2.2卷积神经网络...

MySQL数据库——存储引擎(2)-存储引擎特点(InnoDB、MyISAM、Memory)、存储引擎选择
目录 存储引擎特点 InnoDB 介绍 特点 文件 逻辑存储结构 MyISAM 介绍 特点 文件 Memory 介绍 特点 文件 区别及特点 存储引擎选择 存储引擎特点 上面我们介绍了什么是存储引擎,以及如何在建表时如何指定存储引擎,接下来我们就来介绍比较…...
【Vue】构建vue项目的几种方法以及区别
【Vue】构建vue项目的几种方法以及区别 1.通过vue-cli进行创建2.直接通过npm进行创建3.基于vite创建vue项目4.总结 构建vue项目时请确保已经安装node和npm 1.通过vue-cli进行创建 要用vue脚手架vue-cli创建vue项目首先我们需要全局安装一下vue-cli,安装命令如下&a…...
动态封装对象,属性来自json
需求: 如何动态的获取一个对象的字段,假如一个对象里面有name,age,sex三个字段,我想取name的值,这个name是存在一个json中,json的格式如下[{"key":"name"},{"key":"age…...

【LeetCode-中等题】90. 子集 II
文章目录 组合并集问题汇总:题目方法一:递归加回溯(去重版) 组合并集问题汇总: 1、子集非去重版本 2、组合非去重版本 3、组合去重版本 题目 本题nums数组存在重复元素,所以本题会涉及一个去重操作&#…...

Docker如何安装seafile
SQLite 方式 要在 Docker 中安装 Seafile,您可以按照以下步骤进行操作: 安装 Docker:确保您的系统上已经安装了 Docker。您可以根据您的操作系统类型,在官方网站上找到适合您系统的 Docker 版本并进行安装。 下载 Seafile 镜像&…...

注册法国商标的步骤和时间
注册法国商标的步骤如下: 1、商标查询:在提交申请之前,建议进行商标查询,以确保商标在法国市场上具有独特性和显著性。 2、提交申请:通过法国知识产权局的在线平台提交商标申请。申请时,需要提供以下文件…...

一起学数据结构(6)——栈和队列
上篇文章中,对栈的概念及特点进行了解释,并且给出了栈实现的具体代码。本篇文章将给出队列的基本概念及特点。并给出相应的代码。 1. 队列的概念及结构: 在给出队列的概念之前,先给出上篇文章中提到的栈的概念:一种只…...

【数据结构】二叉树的顺序结构-堆
【数据结构】二叉树的顺序结构-堆 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间…...

2024年java面试--mysql(2)
系列文章目录 2024年java面试(一)–spring篇2024年java面试(二)–spring篇2024年java面试(三)–spring篇2024年java面试(四)–spring篇2024年java面试–集合篇2024年java面试–redi…...
IllegalArgumentException
Caused by: java.lang.IllegalArgumentException:Invalid pulsar service : persistent 参数非法异常 这个异常是由于使用了无效的 Pulsar 服务类型导致的。Pulsar 支持不同的服务类型,例如 persistent、non-persistent 等。 当你在配置 Pulsar 相关的参数时&…...

Git 概述命令、idea中的使用
目录 Git概述 Git代码托管服务 Git常用命令 Git 全局设置 获取 Git 仓库 编辑Git 工作区中文件的状态 本地仓库操作 远程仓库操作 编辑分支操作 标签操作 在IDEA中使用Git 1.获取Git仓库 .gitignore 表示忽略 2.本地仓库操作 3.远程仓库操作 4.分支操作 Git是…...

单片机之硬件记录
一、概念 VBAT 当使用电池或其他电源连接到VBAT脚上时,当VDD断电时,可以保存备份寄存器的内容和维持RTC的功能。如果应用中没有使用外部电池,VBAT引脚应接到VDD引脚上。 VCC:Ccircuit 表示电路的意思,即接入电路的电压&#x…...
QQ文件传输协议研究
引言 我们都知道,现在越来越多的应用采取了 HTTPS or TLS 传输协议,对于一般的协议,我们可以使用中间人技术对流量进行劫持转发,从而破解密文,这边可以参见我的另外一篇文章基于加密邮件协议的中间人攻防实战, 而对于 HTTPS 应用即使是我们采取中间人技术,也很难让浏览器…...

Qt/C++音视频开发51-推流到各种流媒体服务程序
一、前言 最近将推流程序完善了很多功能,尤其是增加了对多种流媒体服务程序的支持,目前支持mediamtx、LiveQing、EasyDarwin、nginx-rtmp、ZLMediaKit、srs、ABLMediaServer等,其中经过大量的对比测试,个人比较建议使用mediamtx和ZLMediaKit,因为这两者支持的格式众多,不…...

LeetCode 35. 搜索插入位置
题目链接 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目解析 该题我们可以采用二分查找的方式,我们可以把数组分为,小于target的一边儿和大于等于target的一边儿。 当midleft(right-left)下标所对应的数大于等于targ…...

7年经验之谈 —— Web测试是什么,有何特点?
Web测试是指对Web应用程序进行验证和评估的过程,以确保其功能、性能和安全性符合预期。 Web测试具体包括以下几个方面的内容: 功能测试:验证Web应用程序是否按照需求规格说明书中定义的功能正常工作。功能测试包括输入验证、表单提交、页面…...

【数据结构】前言概况 - 树
🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:数据结构 🔥该文章针对树形结构作出前言,以保证可以对树初步认知。 目录: 🌍前言:dz…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...