【MySQL】:C/C++链接

C/C++链接

  • 一.前置工作
  • 二.官方手册
  • 三.基本接口
    • 1.初始化和关闭
    • 2.进行连接
    • 3.下达命令
    • 4.获取执行结果
    • 5.释放空间
  • 四.测试源代码

一.前置工作

进行C/C++链接时我们需要第三方库,但实际上在我们安装MySQL时就已经安装了,如果没有安装下面可以再执行该命令进行更新(安装)。

在这里插入图片描述

可以查看自己是否安装。

在这里插入图片描述

简单测试

以下函数是帮助获取mysql版本号的

在这里插入图片描述

由于是链接外部库,所以在编译时需要告诉编译器库的位置,如果不了解可以看我的博客基础静动态库部分。

在这里插入图片描述

在这里插入图片描述

如果它告诉你库找不到,那么就表明链接出错,找准库的位置,或者建立软链接到lib64目录下,具体操作可以看我的软硬链接部分(参考案例:Boost索引的建立,倒排索引部分,引入了jieba库,这里就建立了软链接,以方便我们使用)。这里不用手动连接头文件,是因为头文件本身我们就放在uer/include里,如果你没有,也记得手动连接。

二.官方手册

进入mysql官网。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以在这里选择需要的函数。

在这里插入图片描述

可以在这里查找封装的数据结构。

三.基本接口

1.初始化和关闭

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.进行连接

在这里插入图片描述

1.host:连接的主机
2.user:连接的对象(用户)
3.passwd:密码
4.db:连接的库
5.port:端口号(我个人的端口号是3306)
6.unix_socket:预先套接(直接设为nullptr即可)
7.client_flag:设置为0即可

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.下达命令

在这里插入图片描述

1.SQL对象
2.下达的指令

为了测试,我们在库里建张表。

在这里插入图片描述

向表内进行插入。

在这里插入图片描述

在插入时有个小技巧,如果输错了,不能直接删除,要按ctrl+删除。

在这里插入图片描述

可以看到成功插入,如果我们插入的是中文呢?

在这里插入图片描述

在这里插入图片描述

可以看到出现乱码了,很明显是编码不同造成的,我的mysql编码是UTF8,而客户端默认是latin1。所以在链接成功后,应当将客户端编码也改成UTF8。

在这里插入图片描述

4.获取执行结果

增删改都没什么问题,但问题是查呢

很明显直接使用select是不会进行返回的,那么我们该如何让它显示出来呢?

实际上,在执行查找指令后,它会把数据保存在MYSQL结构体内,需要我们自己提取。

在这里插入图片描述

使用该函数会把数据库里的数据存放到MYSQL_RES的结构体内。

在这里插入图片描述

MySQL内的表结构分为列属性和内容,我们读取出来的就是内容。简单来看,MYSQL_RES的结果就像是方阵。

在这里插入图片描述

1.获取行数

在这里插入图片描述

2.获取列数

在这里插入图片描述

测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.查询结果

想要得到结果,其实遍历方阵就行了,而mysql有专门的函数来干这件事。

在这里插入图片描述

这里的MYSQL_ROW其实就是一个char**类型,它会指向每一行,所以就可以一次得到一行的信息,简单来说可以看作二维数组指针。

在这里插入图片描述

在这里插入图片描述

4.获取列属性

在这里插入图片描述

属性有很多,所以MYSQL_FIELD实际上是一个结构体,下面我们只打印列名。

在这里插入图片描述

在这里插入图片描述

5.释放空间

MYSQL_RES实际上malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的.

在这里插入图片描述

在这里插入图片描述

另外,mysql C api还支持事务等常用操作,大家下来自行了解:

my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
my_bool STDCALL mysql_commit(MYSQL * mysql);
my_bool STDCALL mysql_rollback(MYSQL * mysql);

四.测试源代码

#include<iostream>
#include<mysql/mysql.h>const std::string host="127.0.0.1";
const std::string user="connector";
const std::string passwd="123456";
const std::string db="conn";
const unsigned int port=3306;int main()
{//1.初始化MYSQL *my=mysql_init(nullptr);//MYSQL就是一个结构体if(nullptr==my){std::cerr<<"init mysql error"<<std::endl;return 1;}//2.进行连接if(mysql_real_connect(my,host.c_str(),user.c_str(),passwd.c_str(),db.c_str(),port,nullptr,0)==nullptr){std::cerr<<"connect MYSQL error"<<std::endl;return 2;}mysql_set_character_set(my,"utf8");//更改编码格式//3.下达指令//std::string sql="insert into user(name,age,telephone) values('张三',18,'1527282345')";//细节:可以不带分号//std::string sql="delete from user where id=3";//删除std::string sql="select * from user";//查询int n=mysql_query(my,sql.c_str());if(n==0) std::cout<<"Sucess"<<std::endl;else {std::cout<<"Failed"<<std::endl;return 3;}//查询MYSQL_RES *res=mysql_store_result(my);if(nullptr==res){std::cerr<<"mysql_store_result err"<<std::endl;return 4;}my_ulonglong rows=mysql_num_rows(res);my_ulonglong cols=mysql_num_fields(res);std::cout<<"rows:"<<rows<<std::endl;std::cout<<"cols:"<<cols<<std::endl;//属性MYSQL_FIELD*fields_arr=mysql_fetch_field(res);for(int i=0;i<cols;i++){std::cout<<fields_arr[i].name<<' ';}std::cout<<'\n';//内容for(int i=0;i<rows;i++){MYSQL_ROW row=mysql_fetch_row(res);for(int j=0;j<cols;j++){std::cout<<row[j]<<' ';}std::cout<<'\n';}mysql_free_result(res);//释放空间mysql_close(my);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【解决(几乎)任何机器学习问题】:超参数优化篇(超详细)

这篇文章相当长&#xff0c;您可以添加至收藏夹&#xff0c;以便在后续有空时候悠闲地阅读。 有了优秀的模型&#xff0c;就有了优化超参数以获得最佳得分模型的难题。那么&#xff0c;什么是超参数优化呢&#xff1f;假设您的机器学习项⽬有⼀个简单的流程。有⼀个数据集&…

【Kuiperinfer】笔记01 项目预览与环境配置

学习目标 实现一个深度学习推理框架设计、编写一个计算图实现常见的算子&#xff0c;例如卷积、池化、全连接学会如何进行算子的优化加速使用自己的推理框架推理常见模型&#xff0c;检查结果是否能够和torch对齐 什么是推理框架&#xff1f; 推理框架用于对已经训练完成的模…

基于Spring Boot的智能物流管理系统,计算机毕业设计(带源码+论文)

源码获取地址&#xff1a; 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1759581137025445890

npm ERR! network This is a problem related to network connectivity.

遇到 ETIMEDOUT 错误时&#xff0c;这表明npm尝试连接到npm仓库时超时了&#xff0c;这通常是由网络连接问题引起的。这可能是因为网络不稳定、连接速度慢、或者你的网络配置阻止了对npm仓库的访问。以下是一些解决这个问题的步骤&#xff1a; 1. 检查网络连接 首先&#xff…

java的泛型【详解】

定义类、接口、方法时&#xff0c;同时声明了一个或者多个类型变量&#xff08;如&#xff1a;<E>&#xff09; &#xff0c;称为泛型类、泛型接口&#xff0c;泛型方法、它们统称为泛型。 作用&#xff1a;泛型提供了在编译阶段约束所能操作的数据类型&#xff0c;并自…

Qt 使用QScintilla 编辑lua 脚本

需求&#xff1a; 利用QScintilla 编辑lua 脚本 步骤&#xff1a; 1&#xff0c;下载 QScintilla Riverbank Computing | Download 2, 打开 src/qscintilla.pro 文件 编译出 dll库 3&#xff0c;工程中引入这个库 注意debug 模式 必须加载debug 版本编译的库&#xff0…

Yii2项目使用composer异常记录

问题描述 在yii2项目中&#xff0c;使用require命令安装依赖时&#xff0c;出现如下错误提示 该提示意思是&#xff1a;composer运行时&#xff0c;执行了yiisoft/yii2-composer目录下的插件&#xff0c;但是该插件使用的API版本是1.0&#xff0c;但是当前的cmposer版本提供的…

Selenium实现多页面切换

当使用 Selenium 进行自动化测试或爬取数据时&#xff0c;有时需要处理多个页面之间的切换。以下是一些可能需要多页面切换的情况&#xff1a; 1、打开新窗口/页面&#xff1a; 在当前页面上点击链接、按钮或执行某些操作时&#xff0c;可能会打开一个新的窗口或页面。此时&a…

MySQL 基础知识(六)之数据查询(一)

目录 1 基本查询 1.1 查询相关列 (select * / 列名) 1.2 别名 (as) 1.3 去重 (distinct) 1.4 对列中的数据进行运算 (、-、*、/) 2 条件查询 (where) 2.1 等值查询 () 2.2 非等值查询 (>、<、>、<、!、><) 2.3 逻辑判断 (and、or、not) 2.4 区间判…

matlab发送串口数据,并进行串口数据头的添加,我们来看下pwm解析后并通过串口输出的效果

uintt16位的话会在上面前面加上00&#xff0c;16位的话一定是两个字节&#xff0c;一共16位的数据 如果是unint8的话就不会&#xff0c; 注意这里给的是13&#xff0c;但是现实的00 0D&#xff0c;这是大小端的问题&#xff0c;在matlanb里设置&#xff0c;我们就默认用这个模式…

更快找到远程/自由工作的网站

不要使用Fiver或Upwork。 它们已经饱和了。 下面是10个更快找到远程/自由工作的网站&#xff1a; 1. Toptal 这个网站专门为熟练的自由职业者提供远程工作机会&#xff0c;如Shopify和Priceline等一流公司。 他们只接受软件开发、设计和金融等领域的顶级3%自由职业者。 htt…

普中51单片机学习(九)

蜂鸣器 蜂鸣器简介 在单片机应用的设计上&#xff0c;很多方案都会用到蜂鸣器&#xff0c;大部分都是使用蜂鸣器来做提示或报警&#xff0c;比如按键按下、开始工作、工作结束或是故障等等。改变单片机引脚输出波形的频率&#xff0c;就可以调整控制蜂鸣器音调&#xff0c;产…

问题:从完整的问题解决过程来看,( )是首要环节。A.理解问题 B.提出假设C.发现问题 D.检验假设 #学习方法#学习方法

问题&#xff1a;从完整的问题解决过程来看&#xff0c;&#xff08; &#xff09;是首要环节。A&#xff0e;理解问题 B&#xff0e;提出假设C&#xff0e;发现问题 D&#xff0e;检验假设 A.理解问题 B.提出假设 C&#xff0e;发现问题 参考答案如图所示

Eclipse - Switch Workspace

Eclipse - Switch Workspace References Switch Workspace References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

代码随想录算法训练营DAY20 | 二叉树 (8)

一、LeetCode 701 二叉搜索树中的插入操作 题目链接&#xff1a; 701.二叉搜索树中的插入操作https://leetcode.cn/problems/insert-into-a-binary-search-tree/description/ 思路&#xff1a;见缝插针罢辽。 class Solution {public TreeNode insertIntoBST(TreeNode root, i…

vue3项目配置按需自动导入API组件unplugin-auto-import

场景应用&#xff1a;避免写一大堆的import&#xff0c;比如关于Vue和Vue Router的 1、安装unplugin-auto-import npm i -D unplugin-auto-import 2、配置vite.config import AutoImport from unplugin-auto-import/vite//按需自动加载API插件 AutoImport({ imports: ["…

掘根宝典之C++深复制与浅复制(复制构造函数,默认复制构造函数)

到目前为止我们已经学了构造函数&#xff0c;默认构造函数&#xff0c;析构函数&#xff1a;http://t.csdnimg.cn/EOQxx 转换函数&#xff0c;转换构造函数&#xff1a;http://t.csdnimg.cn/kiHo6 友元函数&#xff1a;http://t.csdnimg.cn/To8Tj 接下来我们来学习一个新函数…

数据传输稳如山,郑州大象陶瓷展文物预防性保护更安心

​一、“人间烟火——古代陶瓷中的衣食住行”郑州展览 2月8日&#xff0c;郑州大象瓷博物馆与郑州紫荆山公园协作&#xff0c;呈现了一场独特的文化盛会。“人间烟火——古代陶瓷中的衣食住行”展览正式拉开帷幕&#xff0c;为市民和游客带来了穿越历史、贯穿古今的文化体验。…

11. Springboot集成Dubbo3(二)示例demo

目录 1、前言 2、注册中心 3、快速开始 3.1、添加dubbo3依赖 3.2、dubbo3-api ​编辑 3.3、dubbo3-server 3.3.1、添加依赖 3.3.2、实现IUserService 3.3.3、添加配置文件application.properties 3.3.4、修改Application启动类 3.3.5、出错解决 3.4、dubbo3-porta…

【零基础学习CAPL】——CAN报文的发送(面板中直接修改信号值进行发送)

🙋‍♂️【零基础学习CAPL】系列💁‍♂️点击跳转 文章目录 1.概述2.面板创建3.系统变量创建4.系统变量与Panel值绑定4.CAPL实现5.效果6.全量脚本1.概述 在前面文章”【零基础学习CAPL】——CAN报文的发送(按下按钮同时周期性发送)“中对于发送报文中的信号是在脚本中固…