c++实现mysql关系型数据库连接与增删改查操作

news2024/9/23 5:16:39

最近老师让我实现这个功能,顺便发个东西,我感觉mysql从入门到精通这本书写的蛮好的,其实连接数据库就是调用mysql-c-api库里面的函数mysql_real_connect,下来的增删改查,也无非就是cmd命令台里面的语句,插入:insert into.....values......;删除:delete from.....;更新:update set......;查询:select*from......

#define _CRT_SECURE_NO_WARNINGS
#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>

// 连接数据库函数
bool ConnectDatabase(MYSQL* mysql) {
    // 初始化数据库
    mysql_init(mysql);//初始化传入的 MYSQL 结构体,设置其内部状态为默认值,准备进行数据库连接

    // 设置字符编码
    mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "gbk");

    // 连接数据库
    if (mysql_real_connect(mysql, "127.0.0.1", "root", "Zyc679613", "db_test", 3306, NULL, 0) == NULL) {//3306端口号
        printf("错误原因: %s\n", mysql_error(mysql));
        printf("连接失败!\n");
        return false;
    }
    return true;
}

// 断掉数据库连接的函数
void DisconnectDatabase(MYSQL* mysql) {
    if (mysql != NULL) {
        mysql_close(mysql);//自带的关闭函数
    }
}

// 执行SQL查询并返回结果
MYSQL_RES* ExecuteQueryAndGetResult(MYSQL* mysql, const char* query) {
    if (mysql_query(mysql, query)) {//mysql_query 是一个PHP函数,它用于执行一个MySQL数据库查询
        printf("Query failed: %s\n", mysql_error(mysql));
        return NULL;
    }
    return mysql_store_result(mysql);
}

// 插入数据函数
void InsertData(MYSQL* mysql, const char* books, const char* category, const char* user, int sale, const char* sort, const char* brands) {
    char query[256];//整一个足够大的字符数组
    snprintf(query, sizeof(query), "INSERT INTO tb_books (books, category, user, sale, sort, brands) VALUES ('%s', '%s', '%s', %d, '%s', '%s')",
        books, category, user, sale, sort, brands);//snprintf返回成功写入的字符,第一个参数指针,第二个大小,第三个格式化。
    if (mysql_query(mysql, query)) {//snprintf 将 SQL 插入语句格式化并写入到 query 数组中,sizeof(query) 确保了写入不会超过数组的大小,从而避免了潜在的安全问题。
        printf("Insert failed: %s\n", mysql_error(mysql));
    }
    else {
        printf("Insert successful!\n");
    }
}

// 查询数据函数,展示函数
void SelectData(MYSQL* mysql) {
    MYSQL_RES* res = ExecuteQueryAndGetResult(mysql, "SELECT * FROM tb_books");
    if (res) {//非空
        MYSQL_ROW row;//指向行数据的指针
        while ((row = mysql_fetch_row(res))) {//mysql_fetch_row 来逐行获取数据
            printf("ID: %s, Books: %s, Category: %s, User: %s, Sale: %s, Sort: %s, Brands: %s\n",
                row[0], row[1], row[2], row[3], row[4], row[5], row[6]);
        }
        mysql_free_result(res);//用于释放查询结果集的内存
    }
}

// 更新数据函数
void UpdateData(MYSQL* mysql, int id, const char* books, const char* category, const char* user, int sale, const char* sort, const char* brands) {
    char query[256];
   // 使用snprintf安全地构造SQL更新语句
    snprintf(query, sizeof(query), "UPDATE tb_books SET books = '%s', category = '%s', user = '%s', sale = %d, sort = '%s', brands = '%s' WHERE id = %d",
        books, category, user, sale, sort, brands, id);
    //更新
    if (mysql_query(mysql, query)) {
        printf("Update failed: %s\n", mysql_error(mysql));
    }
    else {
        printf("Update successful!\n");
    }
}

// 删除数据函数
void DeleteData(MYSQL* mysql, int id) {
    char query[256];
    snprintf(query, sizeof(query), "DELETE FROM tb_books WHERE id = %d", id);
    if (mysql_query(mysql, query)) {
        printf("Delete failed: %s\n", mysql_error(mysql));
    }
    else {  
        printf("Delete successful!\n");
    }
}

// 主函数
int main() {
    MYSQL mysql;// 声明MYSQL结构体变量用于数据库操作
    if (ConnectDatabase(&mysql)) {// 尝试连接数据库
        // 插入数据示例
        InsertData(&mysql, "张宇超自传", "人文科学类", "newuser", 10, "New Sort", "New Brands");

        // 查询数据
        printf("Data after insertion:\n");
        SelectData(&mysql);

        // 更新数据示例
        UpdateData(&mysql, 1, "更新后的Book", "更新后的Category", "updateduser", 20, "更新后的Sort", "更新后的Brands");

        // 再次查询数据以查看更新结果
        printf("Data after update:\n");
        SelectData(&mysql);

        // 删除数据示例
        DeleteData(&mysql, 1);

        // 最后查询数据以查看删除结果
        printf("Data after deletion:\n");
        SelectData(&mysql);

        // 断开连接
        DisconnectDatabase(&mysql);
    }

    system("pause");
    return 0;
}

结果如下:

也可以看看cmd命令行里面的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Javaweb学习之Vue实践小界面(四)

目录 前情回顾 本期介绍 效果图 第一步&#xff1a;前期工作 第二步&#xff1a;建立页眉 效果图 第三步&#xff1a;建立导航栏 效果图 第四步&#xff1a;主要内容放置 效果图 第五步&#xff1a;建立页脚 效果图 综合&#xff1a;将文字和背景更改成自己喜欢的…

PEM燃料电池启停控制策略优化的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 PEM燃料电池启停控制策略优化的simulink建模与仿真。 1.燃料电池提供是燃料转换为电能和热能的装置。 2.功率的输出的改变通过很多因素&#xff0c;如温度&#xff0c;压力…

谷歌、火狐及Edge等浏览器如何使用allWebPlugin中间件响应ActiveX插件事件

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

模型 OGSM(战略规划)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。目标引领&#xff0c;策略驱动&#xff0c;量化衡量。 1 OGSM模型的应用 1.1 电商企业年度增长战略 某电商企业面临激烈的市场竞争&#xff0c;决定运用OGSM模型来规划其年度战略&#xff0c;以实现…

代码随想录Day 25|回溯篇完结,题目:491.递增子序列、46、全排列、47.全排列Ⅱ

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 第七章 回溯算法part05一、题目题目一&#xff1a;491.递增子序列解题思路&#xff1a;回溯三部曲优化 题目二&#xff1a;46.全排列[46. 全排列](https://leetcode.cn/problems/permutations/)解…

日撸Java三百行(day34:图的深度优先遍历)

目录 一、深度优先搜索 二、图的深度优先遍历 三、代码实现 总结 一、深度优先搜索 深度优先搜索&#xff08;Depth First Search&#xff1a;DFS&#xff09;是一种用于遍历树或图的算法&#xff0c;具体来说就是从起始节点开始&#xff0c;沿某一分支路径不断深入&#…

Linux内核定时器、阻塞_非阻塞IO

一.内核时间管理 Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后就周期性的产生定时中断,系统使用定时中断来计时。中断周期性产生的频率就是系统频率…

吴恩达谈AI未来:Agentic Workflow、推理成本下降与开源的优势

近年来&#xff0c;人工智能&#xff08;AI&#xff09;领域的发展势如破竹&#xff0c;然而随着技术的普及&#xff0c;市场也开始出现对AI泡沫的质疑声。2024年8月&#xff0c;AI领域的权威专家吴恩达&#xff08;Andrew Ng&#xff09;在与ARK Invest的对谈中&#xff0c;分…

利用Matlab求解高阶微分方程(ode45)

1、高阶微分方程的基本概念 二阶以及二阶以上的微分方程称之为高阶微分方程&#xff0c;一般来说&#xff0c;微分方程的阶数越高&#xff0c;求解的难度也就越大。求高阶方程的一个常用方法就是降低阶数。对二阶方程 &#xff0c;如果能用变量代换把它化成一阶方程&#xff0c…

【Tesla FSD V12的前世今生】从模块化设计到端到端自动驾驶技术的跃迁

自动驾驶技术的发展一直是全球汽车行业的焦点&#xff0c;Tesla的Full-Self Driving&#xff08;FSD&#xff09;系统凭借其持续的技术革新和强大的数据支持&#xff0c;在这个领域独占鳌头。本文将深入介绍Tesla FSD V12的演进历史&#xff0c;从自动驾驶的基础概念入手&#…

【XML详解】

XML基本概念 XML&#xff08;全称EXtensible Markup Language&#xff0c;可扩展标记语言&#xff09;&#xff1a;是一种用于存储和传输数据的标记语言&#xff0c;通过标签&#xff08;tags&#xff09;来定义数据的结构和含义。数据格式&#xff1a;XML本质上是一种数据的格…

【异常错误】pycharm可以在terminal中运行,但是无法在run中运行(没有输出错误就停止了)

问题&#xff1a; pycharm的命令可以在terminal中运行&#xff0c;但是复制到无法在run中运行&#xff08;没有输出错误就停止了&#xff09; run中运行后什么错误提示都没有 搞不懂为什么 解决&#xff1a; 降低run中batch-size的大小&#xff0c;即可以运行 我并没有观察到…

视频在线去水印解析相册怎么弄,轻松掌握五大技巧

在当前短视频流行的时代&#xff0c;我们常常需要下载一些短视频来进行剪辑或分享&#xff0c;但视频中的水印却成了一个不小的烦恼。为了帮助大家解决这个问题&#xff0c;本文将介绍五款高效的短视频去水印免费软件&#xff0c;让你轻松告别水印烦恼。 工具一&#xff1a;奈…

在VB.net中,LINQ有什么方法与属性

标题 在VB.net中&#xff0c;LINQ有什么方法与属性 正文 在VB.NET中使用LINQ&#xff08;Language Integrated Query&#xff09;&#xff0c;你可以利用一系列的方法和属性来查询和操作内存中的集合&#xff08;如数组、列表等&#xff09;以及数据库等数据源。LINQ提供了丰富…

Python相关系数导图

&#x1f3af;要点 量化变量和特征关联绘图对比皮尔逊相关系数、斯皮尔曼氏秩和肯德尔秩汽车性价比相关性矩阵热图大流行病与资产波动城镇化模型预测交通量宝可梦类别特征非线性依赖性捕捉向量加权皮尔逊相关系数量化图像相似性 Python皮尔逊-斯皮尔曼-肯德尔 皮尔逊相关系…

QcomboBox 组件

在记事本项目中&#xff0c;有一个问题&#xff0c;字体的编码格式是写死的。我们要建一个 组件提供这样的功能&#xff1a;通过点击&#xff0c;获得 不同的格式编码 定义它的槽 首先 把ui里面的comboBox组件与槽关联起来 connect(ui->comboBox,SIGNAL(currentIndexChange…

cesium加载矢量切片数据(mvt)全网方案总结

引言:Cesium是一款开源的3D地球可视化引擎,支持全球范围的数据展示,包括高分辨率地形、卫星图像和建筑模型等,允许用户创建交互式的3D地图,并提供了一系列的工具和API来处理地理空间数据。 Cesium支持加载多数据源的栅格切片数据,例如ArcGIS、BingMaps、WMTS、WMS等等。栅…

Qt 线程与窗体之间的传值

QThread 和窗口之间的通信通常通过信号和槽机制来实现 也可以直接通过调用线程中的值 效果图(Dialog To hello; TextLabel To hello) 在主窗口类中创建线程实例&#xff0c;并连接线程发出的信号到主窗口的槽函数。 .h #ifndef TESTAPP_H #define TESTAPP_H#include <QD…

Threejs学习-Stats 性能监控器、抗锯齿

stats性能监控器 import Stats from three/addons/libs/stats.module.js //引入包//添加性能监视器&#xff0c;查看帧率 const stats new Stats(); document.body.appendChild(stats.domElement); // //渲染 function animate() {requestAnimationFrame(animate);stats.upda…

GraphRAG论文解读

欢迎一起讨论 论文地址综述介绍部分核心翻译翻译解释重要的信息元素和实体的关系&#xff08;包含和被包含&#xff0c;而非相等&#xff09;Graph Index&#xff08;图索引&#xff09;Community Detection&#xff08;社区检测&#xff09;Query-Focused Summarization&#…