C++连接数据库

2023-10-27

一、sql.h
#ifndef SQL_H
#define SQL_H
#include <mysql.h>
#include <iostream>

typedef struct Data {
    std::string name;
    double price;
    int bookCount;
    std::string author;
};

class sql {
public:
    sql();
    ~sql();
    void add();  //增
    void del();  //删
    void display();  //查(选择全部)
    void correct();  //改
private:
    MYSQL mysql;  //数据库连接句柄
    MYSQL_RES* result;  //执行数据库语言结果
    MYSQL_ROW sql_row;  //存放一个数据记录
    Data data;
};

#endif  //sql.h
二、sql.cpp
#include "sql.h"
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
using std::string;
#include <sstream>
using std::stringstream;

sql::sql() {
    mysql_init(&mysql); 
    mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");  //连接之前用
    result = nullptr;  //结果集
    sql_row = nullptr;  //得到结果集的下一行
    if (mysql_real_connect(&mysql, "localhost", "root", "root", "db_study", 3306, NULL, 0)) {
        //mysql_query(&mysql, "SET NAMES GBK");  //连接之后用
        cout << "数据库连接成功!" << endl;
    }
    else {
        cout << "数据库连接失败!" << endl;
        cout << "error reason: " << mysql_error(&mysql) << endl;
    }
}

sql::~sql() {
    mysql_free_result(result);
    mysql_close(&mysql);
    cout << "数据库已断开!" << endl;
}

void sql::add() {
    cout << "请输入您要添加的图书名称、价格、数量和作者:";
    cin >> data.name >> data.price >> data.bookCount >> data.author;
    stringstream oss;
    oss << "insert into tb_books(name,price,bookCount,author) values('" << data.name << "'," << data.price << "," << data.bookCount << ",'" << data.author << "')";
    string temp = oss.str();
    const char* query = temp.data();
    if (!mysql_query(&mysql, query)) {
        cout << "添加成功!" << endl;
    }
    else {
        cout << "添加失败!" << endl;
        cout << "error reason: " << mysql_error(&mysql) << endl;
    }
}

void sql::display() {
    if (!mysql_query(&mysql, "select * from tb_books")) {
        result = mysql_store_result(&mysql);  //得到结果集
        cout << "————————————" << endl;
        cout << "结果集数量:" << mysql_num_rows(result) << endl;  //得到结果集数量
        if (result) {
            while (sql_row = mysql_fetch_row(result)) {
                cout << sql_row[0] << ' ' << sql_row[1] << ' ' << sql_row[2] << ' ' << sql_row[3] << ' ' << sql_row[4] << endl;
            }
        }
        cout << "————————————" << endl;
    }
    else {
        cout << "查询失败!" << endl;
        cout << "error reason: " << mysql_error(&mysql) << endl;
    }
}

void sql::del() {
    cout << "请输入您要删除的id:";
    int id;
    cin >> id;
    stringstream oss;
    oss << "DELETE FROM tb_books WHERE id = " << id;
    string temp = oss.str();
    const char* query = temp.data();
    if (!mysql_query(&mysql, query)) {
        cout << "删除成功!" << endl;
        if (!mysql_query(&mysql, "alter table tb_books auto_increment = 1;")) {
            cout << "重新排序成功!" << endl;
        }
        else { cout << "重新排序失败!" << endl; cout << "error reason" << mysql_error(&mysql) << endl; }
    }
    else {
        cout << "删除失败!" << endl;
        cout << "error reason: " << mysql_error(&mysql) << endl;
    }
}

void sql::correct() {
    /*输入*/
    cout << "请输入您要修改的id:";
    int id;
    cin >> id;
    cout << "请选择您要修改的值(name、price...):";
    string value_pre, value_aft;
    while (1) {
        cin >> value_pre;
        if (value_pre != "name" && "price" && "bookCount" && "author") {
            cout << "不存在该值!请重新输入:";
        }
        else break;
    }
    cout << "请输入 " << value_pre << " 修改后的值:";
    cin >> value_aft;
    /*执行*/
    stringstream oss;
    oss << "UPDATE tb_books SET " << value_pre << " = '" << value_aft << "' WHERE id = " << id;
    string temp = oss.str();
    const char* query = temp.data();
    if (!mysql_query(&mysql, query)) {
        cout << "修改成功!" << endl;
    }
    else {
        cout << "修改失败!" << endl;
        cout << "error reason: " << mysql_error(&mysql) << endl;
    }
}
三、main.cpp
//Author:zouyujie
//Date:2023.1.18
#include "sql.h"
#include <iostream>
using std::cout;
using std::endl;
using std::string;
#include <mysql.h> 
/*主函数*/
int main()
{
    sql sql;
    while (1) {
        cout << "1.增" << endl;
        cout << "2.删" << endl;
        cout << "3.改" << endl;
        cout << "4.查" << endl;
        cout << "5.退出" << endl;
        cout << "请输入您的指令:";
        int order;
        std::cin >> order;
        switch (order) {
        case 1:sql.add(); break;
        case 2:sql.del(); break;
        case 3:sql.correct(); break;
        case 4:sql.display(); break;
        case 5:return 0;
        }
    }

}
四、配置:
  1. 包含目录:MYSQL\include

  1. 库目录:MYSQL\lib

  1. 调试环境:PATH=...\MYSQL\bin

  1. 链接器->输入->附加依赖项:libmysql.lib

  1. 将libmysql.dll添加到项目文件夹中

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++连接数据库 的相关文章

  • 检测到 NuGet 包的版本冲突

    我正在开发 ASP Net core 2 1 Web 应用程序项目 我的解决方案中有 1 个项目和 3 个其他库 它是高级架构 数据访问层 DAL 业务层 BL 公共层 CL 所以我需要添加引用来连接一些库和项目 我已经添加了CL参考我的项
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • C++ 中的软(不是:弱)引用 - 这可能吗?有实施吗?

    在 C 中我正在使用boost shared ptr and boost weak ptr自动删除不再需要的对象 我知道这些与引用计数一起工作 在 Java 中 内存由垃圾收集器管理 它将内置对象引用视为strong WeakReferen
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • std::bind 重载解析

    下面的代码工作正常 include
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS

随机推荐

  • centos7的一些变化,firewalld替换iptables、systemctl 替换service

    1 防火墙命令用firewalld取代了iptables了 查看防火墙状态 systemctl status firewalld 临时关闭防火墙命令 reboot之后 防火墙自动起来 systemctl stop firewalld 永久关
  • QGIS加载谷歌地图(google map)方法

    目录 第一步 第二步 将Google提供的网络地图 包括地图和卫星影像等 作为图层加载到QGIS中 有时可辅助地学分析 QGIS已经提供了OpenStreetMap 在 XYZ Tiles 里面加载即可 谷歌街道地图 http mt2 go
  • 同样是做自媒体,为什么有的人能月入过万,你只能月入几块?

    经常有粉丝跟大周说 自媒体的红利期是不是已经过去了呢 收益低 做自媒体的收益还不够交电费的呢 同样是做自媒体 为什么有的人可以月入过万甚至更多 而一些人只能收益个位数甚至赚不到钱 我们都知道小马过河的故事 牛告诉小马河很浅 松鼠告诉小马河很
  • server 2003搭建文件服务器,使用Windows Server 2003搭建安全文件服务器

    ZDNetChina服务器站 8月14日x86技巧 启用并配置文件服务 Windows Server 2003的管理工具中有一项功能叫做 管理您的服务器 启动该工具之后 可以看到当前服务器上启用的所有服务 并可对这些服务进行管理 点击该界面
  • IOC和DI的关系

    IOC 控制反转 全称为 Inverse of Control 将对在自身对象中的一个内置对象的控制反转 反转后不再由自己本身的对象进行控制这个内置对象的创建 而是由第三方系统去控制这个内置对象的创建 简单来说就是把本来在类内部控制的对象
  • LLM Data Pipelines: 解析大语言模型训练数据集处理的复杂流程

    编者按 在训练大语言模型的过程中 构建高质量的训练数据集是非常关键的一步 但关于构建大模型训练所需数据集的通用数据处理流程 Data pipelines 的相关资料极为稀少 本文主要介绍了基于Common Crawl数据集的数据处理流程 首
  • 基于Spring Boot+ Vue的健身房管理系统与实现

    小熊学Java全能学 面试指南 https javaxiaobear cn 摘要 随着健身行业的快速发展 健身房管理系统成为了提高管理效率和用户体验的重要工具 本论文旨在设计与实现一种基于前后端分离的健身房管理系统 通过前后端分离的架构模式
  • R语言笔记:机器学习【决策树(Decision Tree】

    写在开头 我是一个学R的小白 因为读研老师要求开始接触R 记一记笔记留给自己以后回顾 顺便分享出来嘻嘻 我把需要深入的的函数进行介绍 方便了解这些函数的用法 一些简单的函数我就不放出来啦 决策树这部分的笔记主要是利用分类回归法哈 rpart
  • Python_集合去重的底层原理

    Python 集合去重的底层原理 https www cnblogs com linshuhui p 9580620 html
  • JAVA枚举类型(enum)的巧妙应用

    枚举类型的应用 实例 总结 根据接口文档的需求 需要使用通用的返回值类型进行返回 实例 return 调用的error方法就是先new一个ApiRestResponse对象 然后返回 之前在controller层调用的ImoocMallEx
  • Java和Java之父

    詹姆斯 高斯林 James Gosling 1955年5月19日出生于加拿大 是Java编程语言的共同创始人之一 一般公认他为 Java之父 1983年高斯林获得了美国卡内基梅隆大学计算机科学博士学位 博士论文的题目是 The Algebr
  • python编程语言介绍-Python基础手册 1 —— Python语言介绍

    python logo png Python 是一门优雅而健壮的编程语言 它继承了传统编译语言的强大性和通用性 同时也借鉴了脚本语言和解释语言的简单性和易用性 一 Python 的历史 Python是由创始人贵铎 范 罗萨姆 Guido v
  • js 字符串转换数字

    本文转载至 http www phpweblog net linxiaobo archive 2008 12 29 6250 html PS 今天用到了 一下子想不起来 所以写下来 省得下次又找 方法主要有三种 转换函数 强制类型转换 利用
  • centos 上安装redis 3.0.5

    官网下载安装包 直接使用make编译 报如下错误 root localhost redis 3 0 5 make cd src make all make 1 进入目录 usr local opentest redis 3 0 5 src
  • 记一次udf提权

    靶场myandmygirlfriend 前面的信息收集就不说了 arp scan l nmap扫描主机和端口 dirsearch扫描目录 打开页面可以看到 only be accessed local 谷歌翻译发现是只能本地访问 看一眼源码
  • Problem:ImageView不能显示图片。

    1 问题分析 要实现的功能是 ImageView被加载进了一个绝对布局对象中 并通过不断地设置LayoutParam来改变其位置 其中ImageView中的图片是以方法setBackgroundDrawable加载的 而用此方法 在过去有一
  • STM32ADC多通道采集(基于DMA)

    首先简单介绍DMA DMA Direct Memory Access 直接内存存取 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输 无需CPU干预 节省CPU资源 ADC转换出来的值直接赋值给定义好的变量中 配置好的DMA可
  • PCA降维算法的介绍、多角度推导及python实现

    一 算法原理及数学推导 在对于数据的处理上 特征维度过高经常是一个无法忽视的问题 但是单纯的降维压缩对于数据本身会使得数据信息遭到严重损失 不过以PCA为代表的线性降维算法对这方面有所保证 它的目标是通过某种线性投影 将高维的数据映射到低维
  • JVM内存模型

    内存模型主要分为共享内存和线程独享内存 内存分配原理为1 JVM先检查new关键字 并在常量池中定位到一个类的引用 2 检查定位到的类是否已经经过了加载 解析 初始化等步骤 3 为其分配内存 存储对象实例 一 共享内存 1 运行时常量池 编
  • C++连接数据库

    一 sql h ifndef SQL H define SQL H include