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…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
