【MySQL】使用C++连接数据库
目录
- 前置工作
- 代码
- 常用函数接口
- 整体示例:
前置工作
- 创建数据库并选中
mysql> create database conn;
Query OK, 1 row affected (0.01 sec)mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| conn |
+--------------------+
2 rows in set (0.00 sec)mysql> use conn
Database changed
- 创建表并描述表结构
mysql> create table user( id int primary key auto_increment, name varchar(32) not null, age int not null, telphone varchar(32) unique);
Query OK, 0 rows affected (0.06 sec)mysql> show tables;
+----------------+
| Tables_in_conn |
+----------------+
| user |
+----------------+
1 row in set (0.00 sec)mysql> desc user;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(32) | NO | | NULL | |
| age | int(11) | NO | | NULL | |
| telphone | varchar(32) | YES | UNI | NULL | |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
代码
#include <iostream>
#include <string>
#include <mysql/mysql.h>const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string password = "123456";
const std::string db = "conn";
const unsigned int port = 3306;int main()
{// std::cout<<"mysql client version: "<<mysql_get_client_info()<<std::endl;MYSQL *my = mysql_init(nullptr);if (nullptr == my){std::cerr << " init MYSQL error" << std::endl;return 1;}if (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr){std::cerr << " connect MYSQL error" << std::endl;return 2;}mysql_set_character_set(my, "utf8");// std::cout<<"connect success "<<std::endl;// std::string sql="insert into user(name,age,telphone) values('jim',18,'123488899');";std::string sql="update user set name='李四' where id =2;";// 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 << sql << " success " << std::endl;else{std::cerr << "filed :" << sql << std::endl;return 3;}mysql_close(my);return 0;
}
- 增加删除修改均可正常执行,查询较为复杂,整体代码中有案例
- 如果查询则需要把查询数据保存到结果集,通过mysql所提供的函数 得到行和列,遍历得到结果。
常用函数接口
- 初始化mysql并返回句柄(默认传入nullptr即可)
MYSQL *mysql_init(MYSQL *mysql);
如: MYSQL *mfp = mysql_init(nullptr)
- 链接数据库
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 clientflag);
所需参数分别是 mysql句柄 ,主机ip,sql用户名,sql密码,数据库,端口号,剩余两个填nullptr和0即可
如:
if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
{std::cerr << " connect MYSQL error" << std::endl;return 2;
}
- 设置字符集编码
mysql_set_character_set(myfd, "utf8");
- 执行sql语句
int mysql_query(MYSQL *mysql, const char *q);
- 获取查询结果并保存到结果集
MYSQL_RES *mysql_store_result(MYSQL *mysql);
如:
//把结果存到结果集中MYSQL_RES *res = mysql_store_result(my);if (nullptr == res){std::cerr << " mysql_store_result error" << std::endl;return 4;}
- 获取结果行数mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *res);
- 获取结果列数mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
- 获取列名mysql_fetch_fields
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
如:
my_ulonglong row = mysql_num_rows(res);my_ulonglong col = mysql_num_fields(res);std::cout << "行: " << row << std::endl;std::cout << "列: " << col << std::endl;std::cout<<std::endl;//属性MYSQL_FIELD* fields=mysql_fetch_fields(res);for(int i=0;i<col;++i){std::cout<< fields[i].name<<"\t";}std::cout<<std::endl;
- 获取结果内容mysql_fetch_row
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
如:
//内容for (int i = 0; i < row; ++i){MYSQL_ROW row = mysql_fetch_row(res);for (int j = 0; j < col; ++j){std::cout << row[j] << "\t";}std::cout << "\n";}std::cout<<fields[0].db<<std::endl;std::cout<<fields[0].table<<std::endl;
- 释放结果集
void mysql_free_result(MYSQL_RES *result)
- 关闭mysql连接
void mysql_close(MYSQL *sock);
整体示例:
#include <iostream>
#include <string>
#include <mysql/mysql.h>const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string password = "123456";
const std::string db = "conn";
const unsigned int port = 3306;int main()
{// std::cout<<"mysql client version: "<<mysql_get_client_info()<<std::endl;MYSQL *my = mysql_init(nullptr);if (nullptr == my){std::cerr << " init MYSQL error" << std::endl;return 1;}if (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr){std::cerr << " connect MYSQL error" << std::endl;return 2;}mysql_set_character_set(my, "utf8");// std::cout<<"connect success "<<std::endl;// std::string sql="insert into user(name,age,telphone) values('jim',18,'123488899');";// std::string sql="update user set name='李四' where id =2;";// 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 << sql << " success " << std::endl;else{std::cerr << "filed :" << sql << std::endl;return 3;}//把结果存到结果集中MYSQL_RES *res = mysql_store_result(my);if (nullptr == res){std::cerr << " mysql_store_result error" << std::endl;return 4;}my_ulonglong row = mysql_num_rows(res);my_ulonglong col = mysql_num_fields(res);std::cout << "行: " << row << std::endl;std::cout << "列: " << col << std::endl;std::cout<<std::endl;//属性MYSQL_FIELD* fields=mysql_fetch_fields(res);for(int i=0;i<col;++i){std::cout<< fields[i].name<<"\t";}std::cout<<std::endl;//内容for (int i = 0; i < row; ++i){MYSQL_ROW row = mysql_fetch_row(res);for (int j = 0; j < col; ++j){std::cout << row[j] << "\t";}std::cout << "\n";}std::cout<<fields[0].db<<std::endl;std::cout<<fields[0].table<<std::endl;mysql_free_result(res);mysql_close(my);return 0;
}
相关文章:
【MySQL】使用C++连接数据库
目录 前置工作代码常用函数接口整体示例: 前置工作 创建数据库并选中 mysql> create database conn; Query OK, 1 row affected (0.01 sec)mysql> show databases; -------------------- | Database | -------------------- | information_schema…...
php代码审计,php漏洞详解
文章目录 1、输入验证和输出显示2、命令注入(Command Injection)3、eval 注入(Eval Injection)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL 注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)7、Session 会话劫持(Session Hijacking…...
uniapp 将标题背景更换背景图片 完美解决(附加源码+实现效果图)
问题描述 今天拿到小程序的设计效果图后,标题部分背景需要加背景图片,以往我做的都是标题背景更换颜色等,加背景图片还是第一次遇到,大家可以先看下我的效果图是否与你遇到的问题一致! 首页标题的背景是个背景图片。 …...
必备工具:Postman Newman 详解
目录 Postman Newman 是什么? Postman Newman 的作用 如何使用 Postman Newman? 第一步:安装 Node.js 第二步:全局安装 Newman 第三步:导出集合或环境变量为 JSON 格式 第四步:使用 Newman 运行测试…...
OpenCV基本操作——算数操作
目录 图像的加法图像的混合 图像的加法 两个图像应该具有相同的大小和类型,或者第二个图像可以是标量值 注意:OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加的是模运算 import numpy as np import cv2 as cv imp…...
css实现文字首行缩进的效果
<div class"content"><p>站在徐汇滨江西岸智塔45楼,波光粼粼的黄浦江一览无余。近处,是由龙华机场储油罐改造而来的油罐艺术中心和阿里巴巴上海总部办公处。远处,历史悠久的龙华塔挺拔秀丽,总投资逾600亿元…...
Eclipse-配置彩色输出打印
文章目录 前言配置下载查看是否安装 前言 这是一篇古老的文章,那个时候还在用Eclipse ,现在已经换 IDEA 了… 这是一篇 2018 年的文章,我只是将文章从个人比较挪到了CSDN 中 配置 配置完然后下载下面插件即可生成彩色代码。 下载 ANSI …...
easyx图形库基础:1.基本概念的介绍+图形的绘制。
基本概念的介绍图形的绘制 一.基本概念的介绍。1.为什么要使用easyx图形库2.安装easyx图形库。3.语法相关 二.图形绘制1.窗体创建和坐标的概念。1.基本窗体的创建。2.坐标概念3.改变逻辑坐标。 2.设置图形颜色1.设置描边颜色和描边样式。2.设置图形填充颜色和填充样式3.绘制图形…...
zerotier requesting configuration
Q:zerotir无法获取physical ip A:路由器管理页面开启ipv6...
接口mock常用工具
在进行测试时,我们经常需要模拟接口数据,尤其是在前后端分离项目的开发中,在后端未完成开发时,前端拿不到后端的数据,就需要对后端返回的数据进行模拟。 如下一些工具,可以完成接口的mock。 Yapi 首先添…...
13-把矩阵看作是对系统的描述
探索矩阵乘法:更深刻的理解与应用视角 🧩🔍 引言 📖 在我们进一步探讨矩阵乘法之前,让我们从不同的角度来理解什么是矩阵,以及如何将矩阵视为一个系统。我们之前已经介绍了矩阵的基本概念和运算ÿ…...
Linux系统下安装Git软件
环境说明 Linux系统:CentOS 7.9 安装GCC等 JDK版本:jdk-8u202-linux-x64.tar.gz Maven版本:apache-maven-3.8.8-bin.tar.gz 在以上环境下安装Git(git-2.41.0.tar.gz)软件。 查看是否安装Git软件 查看Git版本&#…...
SpringBoot框架
一、SpringBoot概述 1. 简介 springboot是spring家族中的一个全新框架,用来简化spring程序的创建和开发过程。在以往我们通过SpringMVCSpringMybatis框架进行开发的时候,我们需要配置web.xml,spring配置,mybatis配置,…...
Chrome有些网站打不开,但是火狐可以打开
Chrome有些网站打不开,但是火狐可以打开 问题描述火狐成功界面谷歌报错界面局域网设置使用代理服务器访问成功 解决方案参考 问题描述 开了一个tizi,Chrome不能使用,火狐可以。之前装过插件Ghelper白嫖科学上网,那次之后好像浏览…...
Linux网络基础(中)
目录: 再谈“协议” HTTP协议 认识URL: urlnecode和urldecode HTTP协议格式: HTTP的方法: 简易HTTP服务器: 传输层 再谈端口号: 端口号范围划分: netstat: pidof&…...
【C++起飞之路】初级—— auto、范围for循环、宏函数和内联函数
auto、范围for、内联函数、宏函数和nullptr 一、auto — 类型推导的魔法(C 11)1、auto 是什么?2、工作原理3、优势4、限制和注意事项 二、范围for (C11)1、基本语法2、优势3、工作原理4、注意事项5、C11: 范围 for 循环的扩展: 三…...
开发工具Eclipse的使用之导入项目(import)
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Eclipse使用的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.导读 二.详细操作步骤 1.右击项…...
decimal类型在MySQL中的正确使用 (长度和小数点)
1. MySQL(decimal) 对应 Java(BigDecimal) 2. decimal(16,2) MySQL中类型的设置, 长度16, 保留2位小数 3. 如果长度小于14, 则会出现没小数位的情况...
Mongodb 安装
一、win10安装 服务端下载地址:Download MongoDB Community Server | MongoDB shell 工具下载地址:MongoDB Shell Download | MongoDB 服务端安装时选择custom,否则安装文件没有bin目录。 将安装后的文件中的bin目录加到环境变量。 设置…...
Java技术整理(5)—— Spring篇
Spring是一个全面的全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 1、Spring的核心组件 (1)数据层: JDBC、ORM、OXM、JMS、Transations (2&#x…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
