C/C++连接数据库,包含完整代码。
C/C++连接数据库
本篇文章意在简洁明了的在linux环境下使用C/C++连接远程数据库,并对数据库进行增删查改等操作。我所使用的环境是centos7,不要环境除环境配置外,代码是大同小异的。完整代码在最底部!!!
1.前提准备
在讲解如何使用代码连接数据库前,我们先来了解一下相关环境的问题。有些同学在写完代码后,会发现编译报如下错误。
我相信大家已经能看出问题所在了,那就是相关的lib库和include头文件在编译的时候链接不到。所以大家一定先配置好该链接属性后在进行代码的编译运行!!!
可通过mysql_get_client_info()方法验证lib和include引入是否成功,如下代码所示。
#include <stdio.h>
#include <mysql.h>
int main()
{printf("mysql client Version: %s\n", mysql_get_client_info());return 0;
}
2.必须先对数据库初始化!
//创建数据句柄。
MYSQL *my = mysql_init(nullptr);
3.链接数据库
const std::string host="127.0.0.1";
const std::string user="sja";
const std::string password = "*****";
const std::string db = "books";
const unsigned int port = 8888;
mysql_real_connect(my,//上面创建的数据库句柄MYSQL指针
host.c_str(),//目标数据库主机
user.c_str(),//目标数据库用户名
password.c_str(),//目标数据库用户密码
db.c_str(),//指定连接哪一个库
port, //目标数据库的端口号
//下面两个参数默认如下即可!
nullptr,
0);
4.设置编码格式
连接的数据库默认是阿拉伯语,会有编码混乱问题,为了统一字符的编码我们要自行设置数据库的编码格式。
mysql_set_character_set(my, "utf8");
5.访问数据库
5.1 对数据库增删改的访问
这一部分对数据库的访问相比查询来说不涉及数据的返回问题,所以这部分的操作也是最为简单容易的。话不多说直接上代码。
//这个三个是最简单的,只要sql执行完毕,就完了!std::string sql1 = "insert into test values (4, \'黎明\')";std::string sql2 = "delete from test where id=3";std::string sql3 = "update test set name=\'彬彬\' where id=2";int code =0;mysql_query(my, sql1.c_str());mysql_query(my, sql2.c_str());mysql_query(my, sql3.c_str());//对于返回值code,成功为0。
5.2 对数据库查找的访问
select 其实是最不好处理的!!select sql执行完,只是第一步,还需要对数据进一步解析!解析的过程是需要进行处理的,直接上代码。
// 1.解析数据 -- 获取行号和列号MYSQL_RES *result = mysql_store_result(my);int rows = mysql_num_rows(result);int cols = mysql_num_fields(result);std::cout << "行数: " << rows << ", 列数: " << cols << std::endl;//2.解析数据 -- 获取表中列名 -- 实际开发一般不用,仅仅是为了测试代码的完整性MYSQL_FIELD *fields = mysql_fetch_fields(result);for(int i = 0; i < cols; i++){std::cout << fields[i].name << "\t";}std::cout << std::endl;//3. 解析数据 -- 获取表中的数据 -- 重要for(int i = 0; i < rows; i++){MYSQL_ROW line = mysql_fetch_row(result); //获取完整的一行记录[可能包含了多列]for(int j = 0; j < cols; j++){std::cout << line[j] << "\t"; //将记录内部的多列字符串依次打印!}std::cout << std::endl;}
6.关闭数据库
其中上面的mysql_store_result函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 一定注意这里的内存泄露问题,在关闭数据库前释放result!!!
// 关闭数据库free(result);mysql_close(my);
7.完整代码
#include <iostream>
#include <string>
#include <cstdio>
#include <mysql/mysql.h>const std::string host="127.0.0.1";
const std::string user="username";
const std::string password = "888888888";
const std::string db = "user_databases";
const unsigned int port = 8888;int main()
{//0. 创建mysql句柄MYSQL *my = mysql_init(nullptr);//1. 链接数据库if(mysql_real_connect(my,host.c_str(),user.c_str(), password.c_str(),db.c_str(),port, nullptr, 0) == nullptr){std::cout << "connect failed" << std::endl;return 1;}//1.1: 需要设置链接的编码格式mysql_set_character_set(my, "utf8");std::cout << "connect success" << std::endl;//2. 访问 数据库.test id, name//这个三个是最简单的,只要sql执行完毕,就完了!// std::string sql = "insert into test values (4, \'黎明\')";// std::string sql = "delete from test where id=3";// std::string sql = "update test set name=\'彬彬\' where id=2";//2.1 select 其实是最不好处理的!!select sql执行完,只是第一步,还需要对数据进一步解析!std::string sql = "select name from test where id = 4";int code = mysql_query(my, sql.c_str());if(code != 0){std::cout << "execute: " << sql << " failed" << std::endl;return 2;}std::cout << "execute: " << sql << " success" << std::endl;//2.2 解析数据 -- 获取行号和列号MYSQL_RES *result = mysql_store_result(my);int rows = mysql_num_rows(result);int cols = mysql_num_fields(result);std::cout << "行数: " << rows << ", 列数: " << cols << std::endl;//2.3 解析数据 -- 获取表中列名 -- 一般不用,仅仅是为了测试代码的完整性MYSQL_FIELD *fields = mysql_fetch_fields(result);for(int i = 0; i < cols; i++){std::cout << fields[i].name << "\t";}std::cout << std::endl;//2.4 解析数据 -- 获取表中的数据 -- 重要for(int i = 0; i < rows; i++){MYSQL_ROW line = mysql_fetch_row(result); //获取完整的一行记录[可能包含了多列]for(int j = 0; j < cols; j++){std::cout << line[j] << "\t"; //将记录内部的多列字符串依次打印!}std::cout << std::endl;}//3. 关闭数据库free(result);mysql_close(my);return 0;
}
相关文章:
C/C++连接数据库,包含完整代码。
C/C连接数据库 本篇文章意在简洁明了的在linux环境下使用C/C连接远程数据库,并对数据库进行增删查改等操作。我所使用的环境是centos7,不要环境除环境配置外,代码是大同小异的。完整代码在最底部!!! 1.前…...
AUTOSAR词典:CAN驱动Mailbox配置技术要点全解析
AUTOSAR词典:CAN驱动Mailbox配置技术要点全解析 前言 首先,请问大家几个小小问题,你清楚: AUTOSAR框架下的CAN驱动关键词定义吗?是不是有些总是傻傻分不清楚呢?CAN驱动Mailbox配置过程中有哪些关键配置参…...
C语言 coding style
头文件 The #define Guard #define的保护文件的唯一性,防止被多重包含 格式 : <PROJECT>_< FILE>_H_ PROJECT : XS FILE : MV_CTR 头文件的包含顺序 C System FilesOther LibrariesUser LibraryConditional include 作用域 局部变量 -变量定义时需要…...
Python办公自动化之PDF
Python操作PDF 1、Python操作PDF概述2、批量拆分3、批量合并4、提取内容(文字)5、提取内容(表格)6、提取图片7、PDF添加水印8、加密与解密1、Python操作PDF概述 Python操作PDF主要有两个库:PyPDF2和pdfplumber PyPDF2是一个用于处理PDF文件的Python第三方库 官网文档参考:…...
【每日一题Day331】LC2560打家劫舍 IV | 二分查找 + 贪心
打家劫舍 IV【LC2560】 沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋 。 小偷的 窃取能力 定义为他在窃取过程中能从单间房屋中窃取的 最大金额…...
JVM 参数详解
GC有两种类型:Scavenge GC 和Full GC 1、Scavenge GC 一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,堆的Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到…...
uni-app获取地理位置
在uni-app中,可以通过uni.getLocation()方法获取地理位置。具体步骤如下: 在uni-app项目中的manifest.json文件中,添加需要获取地理位置的权限: {"mp-weixin": {"appid": "...","permission…...
Learn Prompt-Prompt 高级技巧:思维链 Chain of Thought Prompting
Jason Wei等作者对思维链的定义是一系列的中间推理步骤( a series of intermediate reasoning steps )。目的是为了提高大型语言模型(LLM)进行复杂推理的能力。 思维链通常是伴随着算术,常识和符号推理等复杂推理任务出…...
Vim编辑器使用入门
目录 一、Vim 编辑器基础操作 二、Vim 编辑器进阶操作 三、Vim 编辑器高级操作 四、Vim 编辑器文件操作 五、Vim 编辑器文件管理 六、Vim 编辑器进阶技巧 七、Vim 编辑器增强功能 Vim的三种工作模式 一、Vim 编辑器基础操作 1.移动光标 - 光标的移动控制 移动光标有两…...
早餐与风景
来吧,我用流水账描述下这一天。 时维九月,北京的早上有点冷,因为今天有个市场活动要去支撑,按照会议时间的要求,我需要在早上7点半就赶到会场,所以昨天晚上我加班到凌晨处理完了今天要给出去的材料…...
常用python代码串
记录新疆出差期间的一些代码 打开yaml文件python中的专有名词ctrlc 打开yaml文件 with open(/home/cyun/文档/cotton_ws/src/control/scripts/ControlParameter.yaml, r) as file:yaml_data yaml.load(file, Loaderyaml.FullLoader)后面发现像这种打开文件的最好是try一下 p…...
电脑桌面透明便签软件是哪个?
在现代快节奏的工作环境中,许多上班族都希望能够在电脑桌面上方便地记录工作资料、重要事项、工作流程等内容。为了解决这个问题,一款优秀的电脑桌面便签软件是必不可少的。在选择桌面便签软件时,许多用户也希望便签软件能够与电脑桌面壁纸相…...
Git创建干净分支,本地操作不依赖任何分支
clone远程项目: git clone gittest.git查看分支: git branch -a创建新分支: git checkout --orphan test, 返回Switched to a new branch test删除当前项目文件夹下所有文件: git rm -rf .提交变更: git commit -m "new branch for test"查看分支: git branch -a, 发…...
sqlmap tamper脚本编写
文章目录 tamper脚本是什么?指定tamper脚本运行sqlmap安全狗绕过tamper脚本 tamper脚本是什么? SQLMap 是一款SQL注入神器,可以通过tamper 对注入payload 进行编码和变形,以达到绕过某些限制的目的。但是有些时候,SQLM…...
5.5V-65V Vin同步降压控制器,具有线路前馈SCT82630DHKR
描述: SCT82630是一款65V电压模式控制同步降压控制器,具有线路前馈。40ns受控高压侧MOSFET的最小导通时间支持高转换比,实现从48V输入到低压轨的直接降压转换,降低了系统复杂性和解决方案成本。如果需要,在低至6V的输…...
YOLOv5、YOLOv8改进:Decoupled Head解耦头
目录 1.Decoupled Head介绍 2.Yolov5加入Decoupled_Detect 2.1 DecoupledHead加入common.py中: 2.2 Decoupled_Detect加入yolo.py中: 2.3修改yolov5s_decoupled.yaml 1.Decoupled Head介绍 Decoupled Head是一种图像分割任务中常用的网络结构&#…...
Prometheus+Grafana可视化监控【Redis状态】
文章目录 一、安装Docker二、安装Redis数据库(Docker容器方式)三、安装Prometheus四、安装Grafana五、Pronetheus和Grafana相关联六、安装redis_exporter七、Grafana添加Redis监控模板 一、安装Docker 注意:我这里使用之前写好脚本进行安装Docker,如果已…...
怒刷LeetCode的第6天(Java版)
目录 第一题 题目来源 题目内容 解决方法 方法一:哈希表 方法二:逐个判断字符 方法三:模拟减法 第二题 题目来源 题目内容 解决方法 方法一:水平扫描法 方法二:垂直扫描法 方法三:分治法 方…...
SSL双向认证-Nginx配置
SSL双向认证需要CA证书,开发过程可以利用自签CA证书进行调试验证。 自签CA证书生成过程:SSL双向认证-自签CA证书生成 Nginx配置适用于前端项目或前后端都通过Nginx转发的时候(此时可不配置后端启用双向认证) 1.Nginx配置&#…...
GO学习之 远程过程调用(RPC)
GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…...
八大排序(四)--------直接插入排序
本专栏内容为:八大排序汇总 通过本专栏的深入学习,你可以了解并掌握八大排序以及相关的排序算法。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:八大排序汇总 🚚代码仓库:小小unicorn的代码仓库…...
MYSQL--存储引擎和日志管理
存储引擎: 一、存储引擎概念: MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。存储引擎是My…...
VUE之更换背景颜色
1. 确定需求 在实现之前,首先需要明确需求,即用户可以通过某种方式更改页面背景颜色,所以我们需要提供一个可操作的控件来实现此功能。 2. 创建Vue组件 为了实现页面背景颜色更换功能,我们可以创建一个Vue组件。下面是一个简单…...
大型集团借力泛微搭建语言汇率时区统一、业务协同的国际化OA系统
国际化、全球化集团,业务遍布全世界,下属公司众多,集团对管理方式和企业文化塑造有着很高的要求。不少大型集团以数字化方式助力全球统一办公,深化企业统一管理。 面对大型集团全球化的管理诉求,数字化办公系统作为集…...
Quartz 建表语句SQL文件
SQL文件在jar里面,github下载 https://github.com/quartz-scheduler/quartz/releases/tag/v2.3.2 解压,sql文件路径:quartz-core\src\main\resources\org\quartz\impl\jdbcjobstore tables_mysql_innodb.sql # # In your Quartz propertie…...
nginx SseEmitter 长连接
1、问题还原: 在做openai机器人时,后台使用 SseEmitterEventSource 实现流式获取数据,前端通过 EventSourcePolyfill 函数接收后端的数据,在页面流式输出到页面,做成逐字打稿的效果。本地测试后,可以正常获…...
若依cloud -【 100 ~ 】
100 分布式日志介绍 | RuoYi 分布式日志就相当于把日志存储在不同的设备上面。比如若依项目中有ruoyi-modules-file、ruoyi-modules-gen、ruoyi-modules-job、ruoyi-modules-system四个应用,每个应用都部署在单独的一台机器里边,应用对应的日志的也单独存…...
VPN协议是如何工作的
VPN,全名 Virtual Private Network,虚拟专用网,就是利用开放的公众网络,建立专用数据传输通道,将远程的分支机构、移动办公人员等连接起来。 VPN 通过隧道技术在公众网络上仿真一条点到点的专线,是通过利用…...
c++::作用域符解析
1)当存在具有相同名称的局部变量时,要访问全局变量 2)在类之外定义函数。 class A { } void A::func(){ }A a;a.func();3)访问一个类的静态变量 class A { static int b; } A::b; 4) 如果两个命名空间中都存在一个具有相同名称的类…...
【电源专题】什么是充电芯片的Shipping Mode(船运模式)
现在越来越多电子产品小型化,手持化,这样就需要电池来为产品供电。但电池供电造成的另一个难题就是产品的续航能力的强与弱。 如果想提升续航能力,有一种方法是提高电池容量。如果电池体积没有变化的情况下,可能使用了新型材料、高级技术来增加电池容量,但这势必会增加电池…...
微信网站是多少钱一年/百度指数功能模块有哪些
忙里偷闲读首诗–前言 对酒当歌,人生几何?譬如朝露,去日苦多。 你我皆星尘,离合奈何悲欢。不可忙于奔跑,而忘记思考我是谁?我从哪里来?我要到哪里去?不经思索的人生不值得一过。 中国古诗词,源远流长…...
上海企业网站建设方案/河源市企业网站seo价格
毕设要做这个项目 1.UCF101数据集下载(用4G下载貌似快一点) https://www.crcv.ucf.edu/data/UCF101/UCF101.rar 2.标注文件及训练数据和测试数据的列表文件 https://www.crcv.ucf.edu/data/UCF101/UCF101TrainTestSplits-RecognitionTask.zip 文章集锦 简…...
长沙公积金网站怎么做异动/关键词的选取原则
HBase之Rowkey设计总结及易观方舟实战篇 代立冬 2018-06-02 21:52:46 3466 收藏 10 最后发布:2018-06-02 21:52:46首发:2018-06-02 21:52:46分类专栏: --------【HBase优化】 ●HBase 大数据实战系列 版权声明:本文为博主原创文章,遵循…...
抚宁网站建设/推广普通话宣传语100字
已结贴√问题点数:10 回复次数:21关于田忌赛马问题.。。帮忙看下。。谢谢了。。题目描述Here is a famous story in Chinese history."That was about 2300 years ago. General Tian Ji was a high official in the country Qi. He likes to play h…...
做网站开店/千度seo
DHT11简介 DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一个 I/O 口。 传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机 DHT11 的技术参数如下: 工作电压范围: 3.3V-5.5V 工作电流 :平均 0.5mA …...
商城建站流程/设计网站logo
啦啦外卖41.7独立版最新外卖源码全开源 依旧是开源安装版,不是市面上的网站打包的垃圾版本。 包含完整vue源码 安装演示 版本验证 插件列表: vue源码 小程序新接口可以正确获取用户信息:...