【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…...
Jetson Orin Nano无头模式实战:用XRDP远程桌面告别显示器(Ubuntu 22.04 + GNOME)
Jetson Orin Nano无头模式实战:XRDP远程桌面全流程配置指南 当你把Jetson Orin Nano塞进机器人底盘或者嵌入到某个工业设备中时,物理显示器往往成了最不实用的配件。但调试时盯着SSH黑窗口操作图形界面?这就像用螺丝刀吃牛排——不是不行&…...
从靶场到实战:聊聊RCE漏洞那些“花式”绕过姿势(以CTFHUB为例)
RCE漏洞对抗艺术:从基础绕过到高级利用实战 引子:当安全防线遇上创造力 在网络安全的世界里,远程代码执行(RCE)漏洞就像一把双刃剑——它既是攻击者梦寐以求的终极武器,也是防御者必须严防死守的最后防线。不同于简单的SQL注入或X…...
从CloudCompare的ccViewer源码入手,拆解一个工业级Qt+OpenGL点云查看器的架构设计
从CloudCompare的ccViewer源码剖析工业级QtOpenGL点云查看器设计 在三维点云处理领域,一个高效、稳定的可视化工具往往能决定整个工作流程的顺畅程度。CloudCompare作为开源点云处理软件的标杆,其内置的ccViewer模块展现了工业级3D查看器应有的架构水准。…...
从‘一个向量’到‘三个向量’:为什么Transformer的Attention非得用Q、K、V?聊聊设计背后的权衡
从‘一个向量’到‘三个向量’:Transformer注意力机制中Q、K、V的设计哲学 在深度学习领域,Transformer架构彻底改变了自然语言处理的游戏规则。而其中最具革命性的设计,莫过于那个看似简单却暗藏玄机的注意力机制——特别是它独特的Q&#x…...
英雄联盟智能工具集:5大功能助你轻松上分,告别繁琐操作
英雄联盟智能工具集:5大功能助你轻松上分,告别繁琐操作 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟…...
Kubernetes的iptables 与 IPVS【20260419004篇】
文章目录 Kubernetes网络全景解析:内网/外网流量、CNI与Ingress深度指南 第一部分:Kubernetes网络流量模型 1.1 内网流量与外网流量的本质区别 1.1.1 流量类型定义与特征 1.1.2 流量路径对比 1.2 Kubernetes网络模型四大基础原则 第二部分:CNI插件深度解析 2.1 Flannel:简单…...
大模型应用开发实战(20):Agentic RL 正在改变 AI 产品开发方式(技术深度解析)
🤵♂️ 个人主页:小李同学_LSH的主页 ✍🏻 作者简介:LLM学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
告别硬编码!用TwinCAT 3 XML-Server实现设备配方与参数动态加载
工业自动化参数管理的革命:TwinCAT 3 XML-Server实战指南 在一条24小时运转的汽车零部件生产线上,工程师小王正面临一个典型困境——每次切换产品型号时,都需要手动修改PLC程序中的200多个参数,包括冲压压力、传送带速度、机械臂位…...
Tiled地图编辑器:从零开始创建专业2D游戏地图的完整指南
Tiled地图编辑器:从零开始创建专业2D游戏地图的完整指南 【免费下载链接】tiled Flexible level editor 项目地址: https://gitcode.com/gh_mirrors/ti/tiled 想象一下,你正在开发一款2D游戏,需要设计精美的关卡和复杂的地形系统&…...
QwQ-32B开源模型入门:ollama中RMSNorm层稳定性调优指南
QwQ-32B开源模型入门:ollama中RMSNorm层稳定性调优指南 1. 引言:为什么需要关注RMSNorm的稳定性? 如果你用过QwQ-32B或者其他大语言模型,可能遇到过这样的情况:模型运行得好好的,突然就“崩了”——要么输…...
