当前位置: 首页 > news >正文

MySQL——C语言连接数据库

MySQL Connection

​ 连接数据库的客户端除了命令行式的还有图形化界面版本,网页版本,当然也包括语言级别的库或者是包,能够帮助我们直接连接数据库;

一、语言连接库下载

方式一:不建议使用,需要自己配置环境变量,或者将库文件和头文件添加到系统路径之下;

​ 使用语言连接数据库需要注意安装相关的开发库;

​ 网址:https://www.mysql.com/,然后去downloads选中MySQL Community Downloads;

​ 下载连接库Connector/C++ 8.0,找到对应的版本;

在这里插入图片描述

方式二:进行安装yum源,然后在进行下载并安装连接库;

sudo yum install -y mysql-devel

二、使用C/C++访问数据库

2.1MySQL库中的常用数据结构

MYSQL:这个结构主要用于数据库的连接;
MYSQL_RES:这个结构主要用于保存读取结果,以行为单位,用于MYSQL的查询结果转储;
MYSQL_ROW:这个结构主要用于获取转储中的一行数据记录,是一个二维数组;
MYSQL_FIELD:这个结构主要用于获取转储中的相关列属性,是一个结构化的数据类型;

2.2MySQL常用接口

1.使用MySQL必须先进行初始化,初始化一些数据结构;

MYSQL *mysql_init(MYSQL *mysql);
//MYSQL*就相当于C语言中的FILE*和系统的fd文件描述符,用来描述MySQL客户端相关的资源;也可以称之为句柄

2.使用MySQL前需要进行连接MySQL;

MYSQL *
mysql_real_connect(MYSQL *mysql,const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix_socket,unsigned long client_flag);

3.修改MySQL字符集

​ 需要注意连接之后的编码集默认是latin1;

int mysql_set_character_set(MYSQL *mysql,const char *csname);

4.向MySQL中发送SQL语句;

​ 对于增删改,只需要执行sql即可,但是select需要进行后续操作,将数据提交到上层;

​ 还需要注意字符集,防止乱码;

int mysql_query(MYSQL *mysql,const char *stmt_str)//0表示成功,非零表示失败;

5.当不使用了,需要关闭MYSQL*句柄;

void mysql_close(MYSQL*mysql);

2.3C/C++查询的处理细节

​ 当查询完成之后,会将查询结果存放到句柄当中;此时就需要将查询结果提取出来,从句柄当中格式化提取到MYSQL_RES中,进行转储,便于进行二次处理;

MYSQL_RES *mysql_store_result(MYSQL *mysql);
//需要注意的是,该函数会malloc一段空间,所以一定要记得进行free,否则就会造成内存泄露;
void mysql_free_result(MYSQL_RES *result);//使用此函数进行释放内存空间;

​ MySQL中存储的表结构,实际上是存储了两种内容,一种是列属性名,一种是数据内容;当提取表中的记录时,就不会考虑约束了,而是i直接提取出来字符串;

​ 可以将MYSQL_RES结构看作一个char** array[]的结构,其中的一个数组会被当作一行记录,每一条记录由不同的列构成,不同的列是一个字符串;这样既可以按照行读取,也可以按照列进行读取;

​ 为了便于遍历,需要获取行数和列数,就需要用到以下接口实现;

unsigned int mysql_num_fields(MYSQL_RES *result);//返回列数
my_ulonglong mysql_num_rows(MYSQL_RES *result);//返回行数,此时的行数表示的是数据内容,不包括列名称;

​ 直接获取一行的结果;再重复使用下列函数的过程当中,会自动遍历到下一行;

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);//返回值本质上就是一个char**也就是一个二维数组;

​ 获取列名使用如下接口;

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)//一次性获取所有的列;
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)//一个一个的获取,并每次使用会自动下后一个迭代;

示例

#include <iostream>
#include <mysql/mysql.h>
#include <unistd.h>
#include <string>
using std::cerr;
using std::cin;
using std::cout;
using std::endl;
using std::string;const string host = "localhost";
const string user = "user_for_C";
const string password = "dyh15343510133.";
const string database = "for_comm_user_C";
const unsigned int port = 8080;int main()
{// MYSQL对象初始化MYSQL *my = mysql_init(nullptr);if (my == nullptr){cerr << "init mysql error" << endl;return 1;}// 连接MYSQLif (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), database.c_str(), port, nullptr, 0) == nullptr){cerr << "connect mysql error" << endl;return 2;}cout << "connect mysql success" << endl;if (mysql_set_character_set(my, "utf8")){cerr << "设置字符集失败" << endl;return 3;}// 发送SQL语句string sql = "select * from user";if (mysql_query(my, sql.c_str())){cerr << "query error" << endl;}else{cout << "query success" << endl;}// 获取查询结果MYSQL_RES *myres = mysql_store_result(my);if (nullptr == myres){cerr << "mysql_store_result error" << endl;return 4;}int rows = mysql_num_rows(myres);int columns = mysql_num_fields(myres);cout << "行数:" << rows << ",列数:" << columns << endl;// 表的属性MYSQL_FIELD *fields = mysql_fetch_fields(myres);for (int i = 0; i < columns; i++){cout << fields[i].name << "\t\t";}cout << endl;// 表的内容for (int i = 0; i < rows; i++){MYSQL_ROW row = mysql_fetch_row(myres);for (int j = 0; j < columns; j++){cout << row[j] << "\t\t";}cout << endl;}// string sql;// while (true)// {//     cout << "mysql>>>";//     if (!std::getline(cin, sql) || sql == "quit")//     {//         cout << "Bye" << endl;//         break;//     }//     int n = mysql_query(my, sql.c_str());//     if (n == 0)//     {//         cout << sql << " success: " << n << endl;//     }//     else//     {//         cerr << sql << " error: " << n << endl;//     }// }// 释放结果集mysql_free_result(myres);//  MYSQL对象关闭mysql_close(my);return 0;
}

三、图形化界面连接数据库

​ 如Navicat就是使用体验较好的一个图形化界面,但是是一个收费的方案;还有一款是MySQL Workbench,是官方提供的一种图形化界面方案,是一种免费的方案;

相关文章:

MySQL——C语言连接数据库

MySQL Connection ​ 连接数据库的客户端除了命令行式的还有图形化界面版本&#xff0c;网页版本&#xff0c;当然也包括语言级别的库或者是包&#xff0c;能够帮助我们直接连接数据库&#xff1b; 一、语言连接库下载 方式一&#xff1a;不建议使用&#xff0c;需要自己配置…...

新能源汽车推行精益生产:绿色动力下的效率革命

在新能源汽车行业迅猛发展的当下&#xff0c;推行精益生产已成为提升竞争力的关键所在。精益生产&#xff0c;作为一种以客户需求为导向、追求流程最优化和浪费最小化的管理理念&#xff0c;正逐步在新能源汽车领域展现出其独特的魅力。 新能源汽车的兴起&#xff0c;不仅代表了…...

FCA-九数云 试题及答案

第1题【判断题】仪表板中筛选器只能绑定图表或者图表所在分析表的字段&#xff0c;无法绑定父表中的字段。 A. 正确B. 错误 正确答案&#xff1a;B 第2题【单选题】一张绩效奖金看板&#xff0c;分享给公司所有成员查看。希望输入个人的信息前&#xff0c;只可以查看自己的相关…...

qt dragEnterEvent dragLeaveEvent dragMoveEvent dropEvent都不响应的问题解决方案。

环境&#xff1a;vs2019qt5.14.2 坑哦。让我搞了好久。各种不执行&#xff0c;最后发现,不用vs调制&#xff0c;直接运行exe就能接收拖拽了。 记录一下,感觉是qt的bug。上代码。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QText…...

LVS精益价值管理系统 DownLoad.aspx 任意文件读取漏洞复现

0x01 产品简介 LVS精益价值管理系统是杭州吉拉科技有限公司研发的一款专注于企业精益化管理和价值流优化的解决方案。该系统通过集成先进的数据分析工具、可视化的价值流映射技术和灵活的流程改善机制&#xff0c;帮助企业实现高效、低耗、高质量的生产和服务。 0x02 漏洞概述…...

【GIC400】——中断使能

文章目录 中断使能全局中断使能RISC-VCortex-MCortex-A中断控制器使能PLICNVICGIC模块中断使能参考系列文章 【ARMv7-A】——异常与中断 【ARMv7-A】——异常中断处理概述 【ARMv7-A】——进入和退出异常中断的过程</...

容器项目之前后端分离

容器化部署ruoyi项目 #需要的镜像nginx、java、mysql、redis、 #导入maven镜像、Java镜像和node镜像 docker load -i java-8u111-jdk.tar docker load -i maven-3.8.8-sapmachine-11.tar docker load -i node-18.20.3-alpine3.20.tar #拉取MySQL和nginx镜像 docker pull mysql…...

游戏心理学Day04

第二章 心理学的生理基础 第三节 游戏中的感觉应用 认知地图 表象是在没有外在知觉信息来源的情况下&#xff0c;对类似知觉信息的加工。 表征是指信息或知识在心理活动中的表现和记载方式&#xff0c;表征是外部事物在心理活动中的内部再现。 我们对世界的表象&#xff0c…...

文件上传漏洞之upload-labs

前提&#xff1a; 本文中的以xshell命名的均为以密码为admin的一句话木马&#xff0c;而shell命名的则是由冰蝎工具生成的木马。 pass-01&#xff1a;js前端验证 测试性的上传一个一句话木马&#xff0c;发现被拦截了&#xff0c;而且根据推测大概率是前端检测&#xff0c;于…...

解决使用gets(getchar)函数无法输入字符(字符串)和scanf_s函数显示缺少“scanf_s”整型参数的问题

一.函数介绍 gets函数&#xff1a; 该函数就是读取字符串&#xff0c;遇到空格不会停止&#xff0c;直到遇到换行字符&#xff0c;但是也会读取最后的换行字符&#xff08;这也就是我在写代码的时候遇到的一个问题&#xff09; getchar函数&#xff1a; 和gets函数类似&#x…...

Excel的VLOOKUP函数的用法

由于工作需要&#xff0c;最近用Excel的时候比较多&#xff0c;遇到一个需求&#xff0c;刚好需要用到VLOOKUP函数&#xff0c;结果由于对参数的理解不清晰&#xff0c;导致折腾了很久&#xff0c;都没达到想要的效果。所以&#xff0c;这里特此就遇到的坑做一个记录&#xff0…...

【Java面试】十三、ArrayList相关

ArrayList、LinkedList、HashMap等集合&#xff0c;从其前缀可知其对应的数据结构为数组、链表、哈希表。从数据结构&#xff0c;也可反推出集合的结构。 文章目录 1、算法复杂度分析1.1 时间复杂度1.2 常见复杂度1.3 空间复杂度 2、数组2.1 内存寻址2.2 查找元素的时间复杂度2…...

网络简史-基于图论的网络

先看一幅图&#xff1a; 如图&#xff0c;我们对类似 crossbar&#xff0c;banyan tree&#xff0c;b-tree&#xff0c;10-tree&#xff0c;256-tree&#xff0c;甚至 dcn fat-tree 等 “规则拓扑” 网络相当熟悉。规则拓扑网络中&#xff0c;地址信息被编码到拓扑本身&#…...

Git工作机制,暂存区,本地库,远程库管理,常用命令

文章目录 工作机制1. 本地库&#xff0c;暂存区管理2. 分支管理3. 远程库管理 工作机制 工作区&#xff08;写代码&#xff09; ----> 暂存区&#xff08;临时存储&#xff09; ----> 本地库&#xff08;历史版本&#xff09; ----> 远程库&#xff08;GitLab、GitHub…...

找不到steam_api64.dll,无法继续执行的原因及解决方法

电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们经常会遇到一些常见的问题&#xff0c;其中之一就是找不到某个特定的动态链接库文件&#xff0c;比如steamapi64.dll。这个问题可能会导致某些应用程序无法正常运行&#xff0c;给…...

鸿蒙开发接口定制管理:【@ohos.enterpriseDeviceManager (企业设备管理)】

企业设备管理 说明&#xff1a; 本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import enterpriseDeviceManager from ohos.enterpriseDeviceManager;enterpriseDeviceManager.activateAdmin activate…...

Pytorch实用教程:多分类任务中使用的交叉熵损失函数nn.CrossEntropyLoss

nn.CrossEntropyLoss 在 PyTorch 中是处理多分类问题的常用损失函数,它是两个函数 nn.LogSoftmax 和 nn.NLLLoss(Negative Log Likelihood Loss)的组合。使用这个损失函数可以直接从模型得到原始的输出分数(logits),而不需要单独对输出进行 Softmax 处理。下面详细介绍这…...

智慧冶金:TSINGSEE青犀AI+视频技术助力打造高效、安全的生产环境

一、建设背景 冶金行业因其特殊的生产环境和工艺要求&#xff0c;对安全生产、环境保护以及质量监控等方面有着极高的要求。因此&#xff0c;将视频智能监控技术引入冶金行业&#xff0c;不仅有助于提升生产效率&#xff0c;更能有效保障生产安全&#xff0c;降低事故风险。 …...

【ARM+Codesys案例】基于全志T3+Codesys软PLC的3C点胶边缘控制解决方案:整合了运动控制、视觉、激光测高等技术

视觉精密点胶控制方案 针对直交型机构的平面点涂胶应用&#xff0c;基于CODESYS软件平台开发的一站式PC型控制器解决方案&#xff0c;包含运动控制器硬件和点胶应用软件。方案整合了运动控制、视觉、激光测高等技术&#xff0c;高效精密的控制胶水点涂于产品表面或内部&#x…...

描述JSP的内置对象

JSP&#xff08;JavaServer Pages&#xff09;内置对象&#xff08;也称为隐式对象或预定义对象&#xff09;是JSP容器为每个页面提供的Java对象&#xff0c;开发者可以直接在JSP页面中使用它们&#xff0c;而无需显式声明。这些内置对象提供了对JSP页面运行环境信息的快速访问…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)

一、题目解析 对于递归方法的前序遍历十分简单&#xff0c;但对于一位合格的程序猿而言&#xff0c;需要掌握将递归转化为非递归的能力&#xff0c;毕竟递归调用的时候会调用大量的栈帧&#xff0c;存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧&#xff0c;而非…...

项目进度管理软件是什么?项目进度管理软件有哪些核心功能?

无论是建筑施工、软件开发&#xff0c;还是市场营销活动&#xff0c;项目往往涉及多个团队、大量资源和严格的时间表。如果没有一个系统化的工具来跟踪和管理这些元素&#xff0c;项目很容易陷入混乱&#xff0c;导致进度延误、成本超支&#xff0c;甚至失败。 项目进度管理软…...