MySQL 使用C语言

一般使用MySQL很少用命令行,一般都是通过程序内部使用,MySQL也为不同的语言定制了不同的头文件和库函数,可以在自己的程序中通过包含头文件和编译时候链接库函数来使用MySQL。

现在一般安装MySQL的时候就会自动给你安装库函数和头文件。

可以自行通过以下命令查看。

查看库函数                          ls /usr/lib64/mysql

 查看头文件                        ls /usr/include/mysql

 如果没有的话,可以通过以下命令来安装。

安装开发库                         yum install -y mysql-community-devel

然后使用mysql的话,就通过包含头文件以及链接库函数来使用。

包含头文件                      #include<mysql.h> / #include<mysql/mysql.h> 

包含的头文件都是 mysql.h ,但是左边这种方式由于没有指定目录,因此在编译的时候需要添加指定路径

编译链接             

没指定路径:g++ -o test test.cc -I/include/mysql -L/lib64/mysql -lmysqlclient

指定路径:   g++ -o test test.cc  -L/lib64/mysql -lmysqlclient

-I : 这里的 I 是 i 的大写,表明指定头文件的目录

-L : 表明库文件的路径

-l : 这里的 l 是 L 的小写,表明链接的库文件

如果指定了头文件的路径,编译的时候就只需要链接库了。 

MySQL接口介绍

mysql_init()

想要使用一个数据库,必须先初始化。

 通过该函数可以创建一个MYSQL句柄,用来后续操作,传递的值可以为空。

mysql_real_connect()

该函数是通过 init 函数创建的句柄,来和特定的数据库进行连接。

失败返回NULL,成功则返回传入的句柄。

需要指定host,用户,密码,数据库,端口号,最后两个参数可以采用默认,直接填 nullptr 和 0 即可。

 mysql_query()

该函数可以用以下达对应的命令,如 select,insert 之类的语句。

返回值为0表示成功,否则表示失败。

下面做一个实验,来一一试试上面的函数和语句。

#include<iostream>
#include<mysql/mysql.h>
#include<string>using namespace std;const string host = "localhost";
const string user = "lbx";
const string password = "124533lbxLBX..";
const string db = "rootDB";
const unsigned int port = 3306;int main()
{MYSQL * my;my = mysql_init(nullptr);if(my != NULL) cout<<"mysql init successed"<<endl;else cout<<"muysql init failed!"<<endl;if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0))cout<<"mysql connect successed !"<<endl;else cout<<"mysql connect failed !"<<endl;// string sql = "insert into test (name,age) values ('tom',12)";// string sqp = "delete from test where id = 2";// string sql = "update test set name='jack' where id=1";string sql = "select * from test";if(mysql_query(my,sql.c_str())) cout<<"mysql insert failed!"<<endl;else cout<<"mysql insert successed!"<<endl;mysql_close(my);return 0;
}

发现实验结果确实如预想的那样。

但是有个问题!select语句在这里没有现象,需要配合其他函数使用。

注意:有些版本的mysql在远程连接使用的时候,插入数据有中文字符的时候,可能会出现乱码,我这里的版本是 8.0的,因此没有问题,不过如果插入的数据有乱码时,可以通过

int mysql_set_character_set(MYSQL* mysql,  const char* csname)来设置字符集为utf8

 mysql_store_result

针对select语句需要输出或者查看内容的情况,mysql提供该函数来将select 的数据从mysql句柄中提取到 MYSQL_RES 中,然后再输出。

MYSQL_RES 是一个MySQL的一种结构体,能够保存存储在 MYSQL 类型变量中的数据。

不过这个函数的返回值是一个指针,因此肯定在程序中开辟了一块空间,这块空间需要手动释放。

MySQL提供函数用于释放该指针

mysql_free_result()

该函数是专门用来释放MYSQL_RES指针的空间的。 

 如何查看MYSQL_RES中的数据

实际上MYSQL_RES和MYSQL类型一样,都是一个句柄。

因此是无法直接从MYSQL_RES中直接读取数据的,因此MySQL还提供了其他几个函数配合提取数据。

mysql_num_rows()

该函数能够从 MYSQL_RES 中提取数据的行数。 

mysql_num_fields() 

该函数能够从 MYSQL_RES 中提取数据的列数。 

mysql_fetch_fields() 

该函数能够一次性获取所有列名,其返回值类似于一个数组指针,想访问其内容可以采用访问数组指针内容的方式。 

 

 不过 MYSQL_FIELD 本身是一个类,想获取列名还需要知道该类有什么样的成员。

我们可以直接查看该类的成员结构。

 其中列名分为列名和原列名,表明也是。这是因为select查询语句可以对列名进行重命名,因此会出现两个类似的变量。

mysql_fetch_row()

该函数能够获取结果内容,即每一行的内容。

而返回值的 MYSQL_ROW 类型实际上就是一个 char** 类型,因为接受的数据都是以字符串的形式接受的,因此想读取一行的数据,也是当作是一个二维数组来直接操作。

 实验

我们写下如下的代码来实验是否能够得到 select 的数据。

#include<iostream>
#include<mysql/mysql.h>
#include<string>using namespace std;const string host = "localhost";
const string user = "lbx";
const string password = "124533lbxLBX..";
const string db = "rootDB";
const unsigned int port = 3306;int main()
{MYSQL * my;my = mysql_init(nullptr);if(my != NULL) cout<<"mysql init successed"<<endl;else cout<<"muysql init failed!"<<endl;if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0))cout<<"mysql connect successed !"<<endl;else cout<<"mysql connect failed !"<<endl;// string sql = "insert into test (name,age) values ('张三',12)";// string sqp = "delete from test where id = 2";// string sql = "update test set name='jack' where id=1";string sql = "select * from test";if(mysql_query(my,sql.c_str())) cout<<"mysql select failed!"<<endl;else cout<<"mysql select successed!"<<endl;//将数据从my中提取到res中MYSQL_RES* res = mysql_store_result(my);//获取数据的行数my_ulonglong row = mysql_num_rows(res);//获取数据的列数unsigned int col = mysql_num_fields(res);//获取数据的名称MYSQL_FIELD* file_name = mysql_fetch_fields(res);//输出列名for(int i = 0; i < col; i++){cout<<file_name[i].name<<"\t";}cout<<endl;MYSQL_ROW line;for(int i = 0; i < row; i++){//获取一行的数据line = mysql_fetch_row(res);// cout<<line[0]<<"\t"<<line[1]<<"\t"<<line[2]<<"\t";for(int j = 0; j < col; j++){cout<<line[j]<<"\t";}cout<<endl;}mysql_close(my);return 0;
}

发现确实成功获得了数据。

此外。,有一个细节。

 

在这里,我们每次都是直接通过 mysql_fetch_row 来获取一行数据,没有说我们要获得哪一行的数据,但是结果却是正确的结果。

这是因为 res 就类似一个缓冲区,每通过 mysql_fetch_row 获取一行数据时,都会将提取出去的一行数据给删除,因此可以直接获取。

其他的函数

我们当然可以通过C语言链接来做类似于事务的操作。

首先我们可以通过 mysql_query() 来执行启动事务。

 

mysql_autocommit()

该函数用于启动事务。

这个函数可以开始事务是否自动提交。

我们可以通过 mode 参数来设置是否开启自动提交。

1 表示启动自动提交,0表示关闭自动提交。

mysql_commit()

 当启动一个事务可以通过该函数直接提交。

0 表示提交成功,其他表示失败

mysql_rollback()

该函数能够回滚事务。

 

0表示回滚成功, 其他表示失败。 

总结 

本文总结了C/C++如何连接mysql,然后也介绍了连接的函数以及一些注意事项,也介绍了select时的特殊情况所用的函数,并进行了实践,希望对各位有所帮助。

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

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

相关文章

数据资产管理制度探索——浙江篇

在行政事业单位数据资产管理领域&#xff0c;浙江省以创新性思维与高质量发展的战略眼光&#xff0c;积极探索并构建了具有前瞻性和实效性的数据资产管理制度。作为财政部数据资产管理试点省份&#xff0c;浙江省财政厅与省标准化研究院强强联合&#xff0c;充分运用数据溯源、…

【报错】TypeError: Cannot read property ‘meta‘ of undefined

&#x1f608;解决思路 首先这里很明显我们能看到是缺少该参数&#xff1a;meta。 但是经过查找后发现和该参数无关。 &#x1f608;解决方法 后来我上网搜了下&#xff0c;网上的回答大部分偏向于是package.json这个文件中的tabBar.list数组对象只有一条的问题。 网上的大…

基于SpringBoot + Vue实现的租房管理系统设计与实现+毕业论文+开题报告​(包运行成功)

介绍 管理员的主要功能设计为&#xff1a;密码信息管理、注册用户管理、区域管理、出租管理等模块。 房主的主要功能设计为&#xff1a;密码信息管理、个人信息管理、订单管理等模块。 用户的主要功能设计为&#xff1a;用户登录、密码管理、出租管理、收藏管理等模块。 源码论…

数据结构---线性表

1&#xff0c;顺序表实现---动态分配 #include<stdlib.h> #define InitSize 10 typedef struct {int *data;//静态分配int length;int MaxSize; }SqList; void InitList(SqList& L) {L.data (int*)malloc(InitSize * sizeof(int));//分配空间L.length 0;L.MaxSize…

关于SpringCloud,你了解多少?

Why SpringCloud&#xff1f; Spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用 spring boot 的开发风格做到一…

论坛直击|发展新质生产力,高校怎么做?

新质生产力浪潮涌动 三大议题聚焦高校人才培养 今年全国两会的政府工作报告将“大力推进现代化产业体系建设&#xff0c;加快发展新质生产力”列在2024年政府工作任务首位&#xff0c;发展新质生产力的先导是培养拔尖创新人才&#xff0c;高等教育改革必须以立德树人为根本任…

带你从BIOS 小工到年薪百万 之 sense amplifier 的作用以及MRC 如何初始化它

做过BIOS 的同学&#xff0c;肯定看过这张图片 对世界充满好奇心的你&#xff0c;是否想过 其中 Sense amplifier 是做什么用的&#xff1f; 是如何工作的&#xff1f; BIOS 又是如何训练它的&#xff1f; 明天接着写

分布式的计算框架之Spark(python第三方库视角学习PySpark)

基本介绍 Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎 。现在形成一个高速发展应用广泛的生态系统。 特点介绍 Spark 主要有三个特点&#xff1a; 首先&#xff0c;高级 API 剥离了对集群本身的关注&#xff0c;Spark 应用开发者可以专注于应用所要做的计…

transformer在生物基因DNA的应用:DNABERT、DNABERT-2

参考&#xff1a; https://www.youtube.com/watch?vmk-Se29QPBA&t1388s 写明这些训练模型可以最终训练好可以进行DNA特征向量的提取&#xff0c;应用与后续1、DNABERT https://github.com/jerryji1993/DNABERT 主要思路就是把DNA序列当成连续文本数据&#xff0c;直接用…

ES11-12

1-ES11-Promise.allSettled Promise.allSettled0)方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果。 简单来说不管成功失败都会调用.then()&#xff0c;然后处理成功和失败的结果 const promises [ …

项目4-图书管理系统2+统一功能处理

1. 拦截器&#xff08;Interceptor&#xff09; 我们完成了强制登录的功能, 后端程序根据Session来判断用户是否登录, 但是实现⽅法是比较麻烦的。 所需要处理的内容&#xff1a; • 需要修改每个接⼝的处理逻辑 • 需要修改每个接⼝的返回结果 • 接⼝定义修改, 前端代码也需…

淘宝商品详情API数据采集接口|如何快速采集淘宝商品数据?

如何快速采集淘宝商品数据 无论是谁&#xff0c;如果单凭人工的方式去收集淘宝、天猫等平台的商品数据信息&#xff0c;工作量是巨大的&#xff0c;如果借助有采集软件的第三方公司操作&#xff0c;则可实现对大数据的轻松掌握&#xff0c;但是外包给第三方公司需要支付一定的…

javaee初阶———多线程(三)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程专题第三篇,关于线程安全方面的内容 如果有不足的或者错误的请您指出! 目录 八、线程安全问题(重点)1.一个典型的线程不安全的例子2.出现线程不安全的原因3.解决线程不安…

对于普通人来说ChatGPT3.5和4.0的区别,要不要升级GPT4.0

ChatGPT3.5和4.0在官方给出的有哪些区别呢&#xff1f;简单罗列一下&#xff0c;我个人觉得官方给的都太高级&#xff0c;我们平时普通人很难问ChatGPT这种问题。 官方测试所涉及的能力&#xff1a; 视觉能力代码能力数学计算能力工具使用能力与人的交互能力人类专业考试的能…

Node.js从基础到高级运用】二十三、Node.js中自动重启服务器

引言 在Node.js开发过程中&#xff0c;我们经常需要修改代码后重启服务器来应用这些更改。手动重启不仅效率低下&#xff0c;而且会打断开发流程。幸运的是&#xff0c;有一些工具可以帮助我们自动化这个过程。本文将介绍如何使用nodemon来实现Node.js服务器的自动重启。 什么是…

AR智能眼镜方案_MTK平台安卓主板芯片|光学解决方案

AR眼镜作为一种引人注目的创新产品&#xff0c;其芯片、显示屏和光学方案是决定整机成本和性能的关键因素。在这篇文章中&#xff0c;我们将探讨AR眼镜的关键技术&#xff0c;并介绍一种高性能的AR眼镜方案&#xff0c;旨在为用户带来卓越的体验。 AR眼镜的芯片选型至关重要。一…

数据结构---绪论

一、绪论&#xff1a; 1.什么是数据&#xff1f; 数据是信息的载体&#xff0c;是描述客观事物属性的数&#xff0c;字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 数据元素--描述一个个体 数据元素&#xff0c;数据项&am…

React + 项目(从基础到实战) -- 第七期

使用ant design 表单组件,开发登录,注册,搜索功能 React 表单组件 ,受控组件 案列 使用defaultVlue属性 bug : 改变了数据源,但是页面未重新渲染 {/* 表单组件 */}<button onClick{()>{console.log(text);}}>打印</button><button onClick{()>[setText(&…

【InternLM 实战营第二期笔记01】书生·浦语大模型全链路开源体系+InternLM2技术报告

本次课程链接在GitHub上&#xff1a;InternLM/Tutorial at camp2 (github.com) 第一次课程录播链接&#xff1a;书生浦语大模型全链路开源体系_哔哩哔哩_bilibili InternLM2技术报告&#xff1a;arxiv.org/pdf/2403.17297.pdf 一、书生浦语大模型全链路开源体系笔记 Intern…

【读书笔记】自动驾驶与机器人中的SLAM技术——高翔

文章会对本书第五章节及以后章节进行总结概括。每日更新一部分。一起读书吧。 第五章——基础点云处理 重点&#xff1a;点云的相邻关系是许多算法的基础 5.1 激光雷达传感器与点云的数学模型 5.1.1激光雷达传感器的数学模型 雷达有两种&#xff1a;机械旋转式激光雷达&…