一个程序如何连接数据库?以C++为例 - 教程

news/2025/10/28 10:16:56/文章来源:https://www.cnblogs.com/yangykaifa/p/19171095

一、场景模拟

假设我们现在需要维护用户信息,那么我们需要在数据库中创建一个用户信息表来管理用户,表内容包括用户名,密码;

1.1、首先我们要创建一个专门来管理用户信息表所在的数据库的mysql登陆用户:

那么我们先来创建一个登陆mysql的用户吧,把它取名为test,密码设为123456,让它来管理这个用户表所在的数据库:

  • mysql -uroot -p

        这条命令是以root身份登陆到mysql,-u后面跟着要登陆的用户名,-p回车后会让你输入你的密码,如果你登陆成功,你会看到以下下界面:

接下来我们要做的是用root创建一个数据库并创建一个登陆mysql的用户,让这个用户来管理这个库:

  • create database testsql;

    这条命令是创建一个名 为testsql的数据库,如果你创建成功通过show databases;可以查看到创建好的数据库:

create user 'test'@'localhost' identified by '123456' ;

这条命令是创建一个用户,用户名为test,密码为123456,注意:这里的user后面跟的是用户名,@后面跟的是允许这个用户在哪里登陆,localhost表示在本地登陆, identified用来设置密码; 如果你创建成功你在mysql的user表中能看到你的用户名:

上图中的 N 代表的是没有权限 ,Y代表赋予了权限 ,所以接下来我们要做的是给这个用户赋予权限:

这之前我们先来看看没有权限的mysql用户是怎么样的:

mysql -utest -p

然后输入密码 :123456 ,然后我们就用刚才创建好的用户登陆进来了:

查看当前数据库跟表:

 我们再用root管理员用户查看数据库对比:

1.2、用root管理员赋予test用户权限并使用test用户创建一个维护'用户信息的用户表'(注意这里的'用户信息表'的用户指的是客户,指的是业务上的用户)
grant all on testsql.* to 'test'@'localhost';

然后我们再登陆test用户查看数据库:

现在就可以用test用户随意访问testsql这个数据库,并随意建表了:

登陆test账号访问testsql数据库并建一个用户表:

  • use testsql;

  • create table users(id int primary key auto_increment ,
    name varchar(32) not null unique key,
    pwd varchar(32) not null);
  • show tables;

  • show create table users \G

  • select*from users;

这样我们就创建好表了,现在这个表里什么数据都没有,接下来我们就用C++程序来连接一下吧!

二、C++程序连接数据库

2.1、连接前的准备

包含必要头文件,准备好登陆mysql的用户名密码,获取初始化后的MYSQL*句柄:

#include 
#include
using namespace std;
//实现连接数据库的程序
#include 
//连接数据准备
const string username="test";
const string userpwd="123456";
const string host="localhost";
const unsigned int port=3306;
int main()
{//1.初始化MYSQL* my=mysql_init(nullptr);if(nullptr==my){//初始化失败return -1;}//2.连接if(nullptr== mysql_real_connect(my,host.c_str(),\username.c_str(),userpwd.c_str(),\"testsql",port,nullptr,0))return -2;//连接成功sleep(10);//这里我故意设10s 用来运行程序后登陆mysql 的root账号来查看连接状态//关闭mysqlmysql_close(my);return 0;
}

编译程序运行,登陆root账号用show processlist 命令查看连接数据库的用户:

    • g++ -o test mysql_test.cpp -lmysqlclient;

    运行前:

    运行后:

    OK,到这里连接数据库已经成功了,接下来就是用C++程序对数据库进行增删查改了!!

    2.2、增删改
    #include 
    #include
    using namespace std;
    //实现连接数据库的程序
    #include 
    //连接数据准备
    const string username="test";
    const string userpwd="123456";
    const string host="localhost";
    const unsigned int port=3306;
    int main()
    {//1.初始化MYSQL* my=mysql_init(nullptr);if(nullptr==my){//初始化失败return -1;}//2.连接if(nullptr== mysql_real_connect(my,host.c_str(),\username.c_str(),userpwd.c_str(),\"testsql",port,nullptr,0))return -2;//连接成功//sleep(10);
    //-----------------------------------------------------------------------------------//新增代码 数据库增加用户信息string sql="insert into users(name,pwd) values('张三','123123');";if(mysql_query(my,sql.c_str())!=0){//查询失败return -3;}
    //---------------------------------------------------------------------------------//关闭mysqlmysql_close(my);return 0;
    }

    编译运行后查表:

    成功向users表中完成插入!!

    我们插入多几条数据,然后查表:

    ok接下来我们进行删除操作,删除名为李四的用户:

    ok接下来我们进行更新操作,更新王五的密码为654321:

    查表们看到王五的pwd信息被修改为654321!!! :

    以上增删改完成,接下来我们要进行查询操作!!!!(这个比增删改要复杂点)!!!

    2.3、查询操作

    第一步:将查询结果提取到MYSQL_RES类型的结构体中:

    这里用到MYSQL的库函数:

    MYSQL_RES* mysql_store_result(MYSQL*);
    //1.这里的函数参数为MYSQL*,即一开始连接数据库时初始化的句柄
    //2.如果提取成功返回一个MYSQL_RES的结构体指针,失败则返回nullptr

    第二步:通过返回的res获取查询表的行数、列数:

    这里用到获取行、列数的接口:

    unsigned long long mysql_num_rows(MYSQL_RES*);
    unsigned long long mysql_num_fields(MYSQL_RES*);
    //1.传入参数为MYSQL_RES结构体指针
    //2.第一个个函数返回值为行数,第二个函数返回值为列数,类型为unsigned long long;

    第三步:获取内容行:

    这里用到的接口是一个会自动迭代的接口:

    MYSQL_ROW mysql_fetch_row(MYSQL_RES*);
    //1. 传入参数为MYSQL_RES结果集的结构体指针
    //2. 返回的是一个char**类型的MYSQL_ROW

    编译运行:

    第四步:如果想获取属性行用以下接口:

    MYSQL_FILELD* mysql_fetch_fields(MYSQL_RES*);
    //1.传参为MYSQL_RES*
    //2.如果成功返回一个用来获取属性的结构体指针,失败返回nullptr

    再编译运行:

    演示的全部代码:

    #include 
    #include
    using namespace std;
    //实现连接数据库的程序
    #include 
    //连接数据准备
    const string username="test";
    const string userpwd="123456";
    const string host="localhost";
    const unsigned int port=3306;
    int main()
    {//1.初始化MYSQL* my=mysql_init(nullptr);if(nullptr==my){//初始化失败return -1;}//2.连接if(nullptr== mysql_real_connect(my,host.c_str(),\username.c_str(),userpwd.c_str(),\"testsql",port,nullptr,0))return -2;//连接成功//sleep(10);
    //-----------------------------------------------------------------------------------//新增代码 数据库增加用户信息//string sql="insert into users(name,pwd) values('张三','123123');";//string sql="insert into users(name,pwd) values('李四','123123');";//string sql="insert into users(name,pwd) values('王五','123123');";//string sql="delete from users where name='李四'";//string sql="update users set pwd='654321' where name='王五'";string sql="select* from users;";if(mysql_query(my,sql.c_str())!=0){//查询失败return -3;}//提取结果集MYSQL_RES* res=mysql_store_result(my);if(res==nullptr){//提取结果集失败return -4;}//通过结果集获取行数,列数int row=mysql_num_rows(res);int filed=mysql_num_fields(res);//获取属性行MYSQL_FIELD*fileds_array= mysql_fetch_field(res);for(int i=0;i

    三、总结

    3.1、这里用到的接口前面的都好理解,难点在mysql_fetch_row()mysql_fetch_fields()这两个接口

    我们这样理解:

    同理获取属性行的接口类似;

    以上为本次分享的所有内容,如果对你有所帮助记得点赞收藏+关注哦!!

    咱下期见!!!

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

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

    相关文章

    基于MATLAB的多目标粒子群算法(MOPSO)实现帕累托最优解群

    一、算法原理与核心步骤 多目标粒子群优化(MOPSO)通过群体协作搜索多目标问题的帕累托最优解集,其核心步骤包括:粒子初始化:随机生成粒子群的位置和速度 适应度评估:计算每个粒子的多目标函数值 支配关系判断:筛…

    跨网数据交换平台有哪些优势与应用解析

    跨网数据交换平台是现代企业实现高效信息流通的重要工具。它不仅提升了数据传输的安全性,还为企业提供了高效的操作方式,确保信息在各个网络之间顺畅流动。这些平台通过加密技术和多重身份验证,更好地保护敏感数据,…

    2025 年搬运公司最新推荐榜,技术实力与市场口碑深度解析覆盖工厂搬迁 / 设备搬运 / 吊装搬运全场景公司推荐

    引言 在工业化与物流行业深度融合的背景下,吊装搬运服务已成为保障工业项目落地、企业运营迁移的核心环节。为破解市场服务碎片化、技术能力参差不齐等痛点,本次榜单依托中国起重吊装协会 2025 年度行业测评体系编制…

    2025年度液压式变位机供应商TOP3综合榜单:头尾升降变位机/L型变位机/焊接操作机源头厂家精选

    在焊接自动化领域,液压式变位机能将工件旋转至最佳焊接位置,使焊缝成型质量提升30%以上,同时降低工人劳动强度。 本文将根据液压式变位机供应商的技术实力、产品性能、市场应用及行业口碑等多维度数据,为您推荐三家…

    2025年口碑好的合同档案管理系统数字化

    2025年口碑好的合同档案管理系统数字化推荐引言在数字化浪潮席卷各行各业的今天,合同档案管理系统的数字化转型已成为企业提升运营效率、降低法律风险的关键举措。2025年,随着人工智能、区块链等技术的深度融合,合同…

    Spring Boot中Spring Data JPA的常用注解

    在Spring Boot中,Spring Data JPA通过一系列注解简化了数据库操作,这些注解主要用于实体类与数据库表的映射、字段约束、关系定义等。 一、实体类与表映射注解@Entity作用:标记类为JPA实体类,对应数据库中的一张表…

    从零开始制作 MyOS(三)

    从零开始制作 MyOS(三)—— 切换保护模式 目标 今天的目标是从实模式切换到保护模式 保护模式切换流程设置GDT (lgdt) 启用A20地址线 设置CR0.PE标志 远跳转刷新流水线 初始化保护模式段寄存器关键组件解析GDT 设置g…

    2025年口碑好的富氢水机招商加盟项目合作

    2025年口碑好的富氢水机招商加盟项目合作指南 随着健康饮水理念的普及,富氢水机因其抗氧化、促进新陈代谢等功效,成为净水行业的新宠。2025年,富氢水机市场迎来爆发式增长,众多企业纷纷布局招商加盟业务。本文精选…

    2025年评价高的澳洲海外仓一件代发跨境电商优选平台榜

    2025年评价高的澳洲海外仓一件代发跨境电商优选平台榜 引言 随着跨境电商的蓬勃发展,澳洲市场因其稳定的消费能力和成熟的电商环境,成为众多中国卖家的首选目标。然而,物流和仓储问题一直是跨境卖家的痛点,尤其是…

    向JKS(Java KeyStore)文件中添加证书

    向JKS(Java KeyStore)文件中添加证书向JKS(Java KeyStore)文件中添加证书是一个常见的操作,主要用于配置SSL/TLS。下面我将为你详细介绍操作方法、注意事项以及相关概念。 🗂️ 理解JKS的类型 首先,理解JKS的两…

    2025年评价高的企业目视化规划最新品牌实力榜品牌

    2025年评价高的企业目视化规划最新品牌实力榜在当今竞争激烈的商业环境中,企业目视化管理已成为提升运营效率、增强安全性和塑造品牌形象的关键战略。目视化规划通过直观的视觉元素将复杂的管理流程简化,使信息传递更…

    2025年口碑好的河南公司注册代理记账企业推荐榜

    2025年口碑好的河南公司注册代理记账企业推荐榜 在当今竞争激烈的商业环境中,选择一家专业、可靠的代理记账公司对企业的发展至关重要。河南作为中部地区的重要经济省份,拥有众多优秀的财税服务企业,它们凭借专业的…

    若干思维题总结

    P6005 [USACO20JAN] Time is Mooney G 题目描述 Bessie 正在安排前往牛尼亚的一次出差,那里有 \(N\)(\(2 \leq N \leq 1000\))个编号为 \(1 \ldots N\) 的城市,由 \(M\)(\(1 \leq M \leq 2000\))条单向的道路连接…

    2025年热门的窖藏坛装涪陵榨菜品牌

    2025年热门的窖藏坛装涪陵榨菜品牌推荐指南 在涪陵这片被誉为“中国榨菜之乡”的土地上,榨菜产业历经百年沉淀,已成为中国饮食文化的重要符号。随着消费者对健康、品质和传统工艺的追求,窖藏坛装榨菜凭借其独特的风…

    2025年度印刷机专用稳压器生产商TOP3综合实力榜单:干式稳压器/智能型稳压器/无触点稳压器源头厂家精选。

    在印刷行业,电压稳定性直接决定印刷品质与设备寿命,一款高性能专用稳压器能有效保障设备持续稳定运行。 本文将根据技术性能、场景适配性与市场反馈,为您推荐三家在印刷机专用稳压器领域表现卓越的生产商,帮助印刷…

    【译】在 Visual Studio 中引入计划功能(公开预览版)

    快速提示对于小的修改很有用,但在大型项目中就力不从心了。您最终会不断重写指令、反复调整,还得指望模型能按计划进行。它为 Copilot 提供了一条清晰、结构化的路径去遵循,这条路径会随着工作的推进而更新,并且让…

    2025年口碑好的企业VI设计实力公司

    2025年口碑最佳的企业VI设计实力公司权威推荐指南 在品牌竞争日益激烈的商业环境中,企业视觉识别系统(VIS)已从简单的视觉包装升维为企业战略的核心组成部分。优秀的VI设计不仅能提升品牌辨识度,更能通过系统化的…

    2025年评价高的团餐配送最新用户口碑榜品牌

    2025年评价高的团餐配送最新用户口碑榜品牌 在快节奏的现代生活中,团餐配送服务已成为企事业单位、学校、医院等机构的重要后勤保障。随着消费者对食品安全、营养搭配和服务效率的要求不断提高,优质的团餐品牌凭借规…

    2025 年深圳餐饮设计公司最新推荐榜,聚焦机构专业能力与项目落地成效深度剖析潮流引领 / 功能优化 / 成本精控 / 品牌塑造公司推荐

    引言 为助力深圳餐饮经营者精准选择专业设计机构,本次推荐榜由餐饮品牌建设协会联合深圳餐饮行业协会共同发起测评,历时 3 个月完成数据采集与分析。测评采用 “三维九项” 评估体系,从专业能力(包括 IP 策划深度、…

    pwn中常用函数

    pwn中常用函数 输入输出类 write()函数 *函数原型:**ssize_t write(int fd, const void *buf, size_t count) 函数功能:由fd指定输出的位置,将buf的内容进行输出,输出的长度为n 函数参数:fd:文件描述符;write一…