【Mysql】第十四章 使用C语言链接(环境配置+连接库+sql函数)

news2024/12/22 12:11:40

文章目录

  • 1.下载库
  • 2.上传库
  • 3.编译库
  • 4.连接库
    • 创建对象-mysql_init
    • 连接数据库-mysql_real_connect
    • 关闭数据库连接-mysql_close
  • 5.sql函数
    • 设置编码格式-mysql_set_character_set
    • 发送请求-mysql_query
    • 获取查询结果-mysql_store_result
    • 获取查询结果的行数-mysql_num_rows
    • 获取查询结果中的一行数据-mysql_fetch_row
    • 获取查询结果的列数-mysql_num_fields
    • 获取查询结果的列属性-mysql_fetch_fields
    • 实例


1.下载库

  • 进入官网Mysql
  • 选择DEVELOPER ZONE
  • 点击MySQL Downloads
  • 选择Download Archives
  • 选择MySQL Connector/C
  • image-20240805105825079

2.上传库

  • 找到需要存放的库,我建立一个thirdpath库,我的路径/home/aaa/thirdpath/
  • rz -E命令上传下载的库
  • tar -xzf mysql-connector-c-6.1.11-linux-glibc2.12-x86_64.tar.gz//把库解压
  • mv mysql-connector-c-6.1.11-linux-glibc2.12-x86_64 mysql-connector//改名方便
  • cd connector//会发现include(头文件)lib(动静态库)

3.编译库

  • ln -s ~/thirdpath/mysql-connector/include include
  • ln -s ~/thirdpath/mysql-connector/lib lib
  • 在项目的目录下创建上面两个软连接,我的项目是file(路径是/home/aaa/file),我就在file文件夹下创建软连接

通过调用mysql_get_client_info来判断库是否引入成功,该函数的作用就是获取客户端的版本信息,使用的文件test.cc

#include <iostream>
#include <mysql.h>
using namespace std;

int main()
{
    //获取客户端的版本信息
    cout<<"mysql client version: "<<mysql_get_client_info()<<endl;

    return 0;
}

编译

g++ -o test test.cc -I./include/ -L./lib/ -lmysqlclient

解决libmysqlclient.so.18 => not found

在这里插入图片描述

echo /home/aaa/thirdpath/mysql-connector/lib > test.conf
sudo cp test.conf /etc/ld.so.conf.d/
ls /etc/ld.so.conf.d/   //发现test.conf就算成功
sudo ldconfig
ldd test //发现libmysqlclient.so.18 =>不是not found就算成功

之后./test成功运行

4.连接库

创建对象-mysql_init

MYSQL* mysql_init(MYSQL *mysql);
例如:MYSQL*m1 = mysql_init(NULL);
  • 如果传入的参数是NULL,那么mysql_init将自动为你分配一个MySQL对象并返回。
  • 如果传入的参数是一个地址,那么mysql_init将在该地址处帮你完成初始化。

连接数据库-mysql_real_connect

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 clientflag);
例如:MYSQL*m2 = mysql_real_connect(m1,"127.0.0.1", "king", "123456","connect_demon", 3306, NULL, 0);

参数

  • mysql: 调用mysql_init函数创建的MySQL对象。
  • host: MySQL服务器的IP地址,"127.0.0.1"表示本地MySQL服务器。
  • user: MySQL服务器,用户名。
  • passwd: MySQL服务器,用户密码
  • db: MySQL服务器,需要使用的数据库。
  • port: MySQL服务器,对应的端口号。
  • unix_socket: 使用的套接字或命名管道,通常设置为NULL。
  • clientflag: 设置为多个标志位的组合,表示允许特定的功能,通常设置为0。

返回值

  • 如果连接数据库成功,则返回一个MySQL对象,该对象与第一个参数的值相同。
  • 如果连接数据库失败,则返回NULL。

关闭数据库连接-mysql_close

void mysql_close(MYSQL *sock);

实例:

#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;

const string host = "127.0.0.1";
const string user = "king";
const string passwd = "123456";
const string db = "connect_demon";
const int port = 3306;

int main()
{
    //1、创建MySQL对象
    MYSQL* ms = mysql_init(nullptr);
    //2、连接数据库
    if(mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        cerr<<"数据库连接失败!"<<endl;
        return 1;
    }
    cout<<"数据库连接成功!"<<endl;

    //3、关闭数据库
    mysql_close(ms);
    cout<<"数据库关闭成功!"<<endl;
    return 0;
}

5.sql函数

设置编码格式-mysql_set_character_set

int mysql_set_character_set(MYSQL *mysql, const char *csname);
mysql_set_character_set(m1, "utf8"); //设置编码格式为utf8
  • mysql: 表示在连接数据库前,调用mysql_init函数创建的MySQL对象。
  • csname: 表示要设置的编码格式,如"utf8"
  • 返回值为0表示设置成功,否则表示设置失败。

发送请求-mysql_query

int	mysql_query(MYSQL *mysql, const char *q);
例如:
string sql = "insert into user values (4,'赵六',25)";
mysql_query(m1, sql.c_str());
  • mysql: 表示在连接数据库前,调用mysql_init函数创建的MySQL对象。
  • q: 表示向MySQL服务器下发的SQL请求,SQL最后可以不带分号。
  • 返回值为0表示SQL执行成功,否则表示SQL执行失败。

获取查询结果-mysql_store_result

MYSQL_RES* mysql_store_result(MYSQL *mysql);
例如:
MYSQL_RES* res = mysql_store_result(m1);
free(m1);
  • 查询结果保存到MYSQL_RES指针中进行返回
  • MYSQL_RES指针的内存空间是malloc出来,使用完后需要调用free函数进行释放

获取查询结果的行数-mysql_num_rows

my_ulonglong mysql_num_rows(MYSQL_RES *res);
例如:
int rows = mysql_num_rows(res); //数据的行数

获取查询结果中的一行数据-mysql_fetch_row

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
例如:
MYSQL_ROW row = mysql_fetch_row(res);//获取一行数据

注意:MYSQL_ROW本质就是char**类型

获取查询结果的列数-mysql_num_fields

unsigned int mysql_num_fields(MYSQL_RES *res);
例如:
int cols = mysql_num_fields(res); //数据的列数

获取查询结果的列属性-mysql_fetch_fields

MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES *res);
例如:
MYSQL_FIELD* fields = mysql_fetch_fields(res);//获取每列的属性

实例

#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;

const string host = "127.0.0.1";
const string user = "king";
const string passwd = "123456";
const string db = "connect_demon";
const int port = 3306;

int main()
{
    //1、获取MySQL实例(相当于给我们创建了一个MySQL句柄)
    MYSQL* ms = mysql_init(nullptr);
    //2、连接数据库
    if(mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        cerr<<"数据库连接失败!"<<endl;
        return 1;
    }
    cout<<"数据库连接成功!"<<endl;
    mysql_set_character_set(ms, "utf8"); //设置编码格式为utf8
    
    //3、查询数据库表中的记录
    //a、执行查询语句
    std:string sql = "select * from user";
    if(mysql_query(ms, sql.c_str()) != 0)
    {
        cout<<"查询数据失败!"<<endl;
        return 2;
    }
    cout<<"查询数据成功!"<<endl;
    //b、获取查询结果
    MYSQL_RES* res = mysql_store_result(ms);
    int rows = mysql_num_rows(res); //数据的行数
    int cols = mysql_num_fields(res); //数据的列数
    //获取每列的属性并打印列名
    MYSQL_FIELD* fields = mysql_fetch_fields(res);
    for(int i = 0;i < cols;i++)
    {
        cout<<fields[i].name<<"\t";
    }
    cout<<endl;
    for(int i = 0;i < rows;i++)
    {
        //获取一行数据并进行打印
        MYSQL_ROW row = mysql_fetch_row(res);
        for(int j = 0;j < cols;j++)
        {
            cout<<row[j]<<"\t";
        }
        cout<<endl;
    }
    free(res); //释放内存空间
    
    //4、关闭数据库
    mysql_close(ms);
    cout<<"数据库关闭成功!"<<endl;
    return 0;
}


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

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

相关文章

案例开发-日程管理2第一期(超详细教程、配备图文和源代码注释,没学过也能看懂)

文章目录 一、 项目前期准备1.数据库准备2.导入依赖3.pojo包处理4.dao包处理5.service包处理6.controller包处理7.加密工具类的使用8.页面文件的导入 总结 一、 项目前期准备 1.数据库准备 创建schedule_system数据库并执行如下语句 SET NAMES utf8mb4; SET FOREIGN_KEY_CHE…

国产AI大模型:从萌芽到繁盛,未来可期

I一、AI****大模型的起源 自1950年图灵提出著名的“图灵测试”以来&#xff0c;人工智能领域经历了从学术探索到实际应用的转变。1956年达特茅斯会议上“人工智能”一词的首次提出&#xff0c;标志着AI正式成为学术研究的焦点。进入21世纪&#xff0c;随着计算能力的显著提升和…

【Pyspark-驯化】一文搞懂Pyspark中的withColumnRenamed函数的使用技巧

【Pyspark-驯化】一文搞懂Pyspark中的withColumnRenamed函数的使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获取…

常见的中间件漏洞:Tomcat

Tomcat简介 tomcat是一个开源而且免费的isp服务器&#xff0c;默认端口:8080&#xff0c;属于轻量级应用服务器。它可以实现JavaWeb程序的装载&#xff0c;是配置JSP(Java Server Page)和JAVA系统必备的一款环境。在历史上也披露出来了很多的漏洞&#xff0c;这里我们讲几个经典…

.NET_WPF_使用Livecharts数据绑定图表

相关概念 LiveCharts 是一个开源的图表库&#xff0c;适用于多种 .NET 平台&#xff0c;包括 WPF、UWP、WinForms 等。LiveCharts 通过数据绑定与 MVVM 模式兼容&#xff0c;使得视图模型可以直接控制图表的显示&#xff0c;无需直接操作 UI 元素。这使得代码更加模块化&#x…

JavaEE: Thread类以及线程状态

文章目录 Thread类等待一个线程 - join()获取当前线程的引用sleep 线程状态 Thread类 等待一个线程 - join() 操作系统,针对多个线程的执行,是一个"随机调度,抢占式执行“的过程. 线程等待就是在确定两个线程的"结束顺序”. 我们无法确定两个线程调度执行的顺序,但…

物理动力系统的强化学习:一种替代方法

物理动力系统的强化学习&#xff1a;一种替代方法 一、物理和非线性动力学 控制理论通过经典的、鲁棒的和最优的方法&#xff0c;使现代文明成为可能。炼油、电信、现代制造业等都依赖于它们。控制理论建立在物理方程提供的洞察力之上&#xff0c;例如从牛顿定律和麦克斯韦方程…

干货分享 | TSMaster 测试报告生成器操作指南

用户在基于 TSMaster 软件开发测试用例时&#xff0c;或需要使用 TSMaster 生成 HTML 报告时&#xff0c;需要使用 TSMaster 测试报告生成器。 1、Test_Report 说明 Test_Report 是目前 TSMaster 为客户提供的一套测试报告模板&#xff0c;里面集成了测试报告的打印输出、图片…

android13去掉安全模式 删除安全模式

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题排查 3.修改方法 3.1方法1 3.2方法2 4.测试 5.彩蛋 1.前言 Android设备上的安全模式是一种诊断模式,当设备无法正常启动时,它会启动到这个模式。在这个模式下,只有系统自带的程序和服务会被运行,所有的第三方…

谷粒商城实战笔记-139-商城业务-nginx-搭建域名访问环境一(反向代理配置)

文章目录 一&#xff0c;管理员身份修改hosts文件二&#xff0c;配置Nginx反向代理product服务1&#xff0c;Nginx配置文件简介2&#xff0c;配置Nginx将gulimall.com的请求转发到product服务 本节的主要内容是讲述如何实现通过域名 gulimall.com访问谷粒商城系统。 主要实现思…

IDEA右键新建时没有Java Class选项

项目场景&#xff1a; IDEA右键新建时没有Java Class选项 问题描述 IDEA右键新建时没有Java Class选项 原因分析&#xff1a; 提示&#xff1a;这里填写问题的分析&#xff1a; 例如&#xff1a;Handler 发送消息有两种方式&#xff0c;分别是 Handler.obtainMessage()和 Ha…

InstantMesh 论文学习

论文链接&#xff1a;https://arxiv.org/abs/2404.07191 代码链接&#xff1a;https://github.com/TencentARC/InstantMesh 解决了什么问题&#xff1f; 这项技术可以从单个视角的2D图像中生成3D模型&#xff0c;这有助于简化3D内容的创建过程。3D资产的生成可以应用于虚拟现…

Pytorch人体姿态骨架生成图像

ControlNet是一个稳定扩散模型&#xff0c;可以复制构图和人体姿势。ControlNet解决了生成想要的确切姿势困难的问题。 Human Pose使用OpenPose检测关键点&#xff0c;如头部、肩膀、手的位置等。它适用于复制人类姿势&#xff0c;但不适用于其他细节&#xff0c;如服装、发型和…

Altium designer学习笔记03 -原理图绘制

原理图绘制 1. 原理图页大小设置2.原理图格点的设置3. 原理图模板的应用4. 元件的放置5.元件属性的编辑6.元件的选择、移动、旋转、镜像6.1 元件的选择6.2 元件的移动6.3 元件的旋转6.3 元件的镜像 7.元件的复制/剪切/粘贴8.元件的排列与对齐9.绘制导线的导线属性设置10.放置网…

基于Comsol进行薄膜型声学超表面设计与可调节性研究

研究背景&#xff1a; 在隔声领域&#xff0c;高频噪声属于易于隔离的频段噪声&#xff0c;使用隔音板或隔音墙便可达到良好的隔声效果。而低频噪声由于具有波长大、穿透性强、传播距离远等特点&#xff0c;根据质量作用定律&#xff0c;传统的隔声材料需要通过不断增加材料的…

低代码与软件定制开发的完美结合:生产管理软件的高效解决方案

引言 在当今快速变化的商业环境中&#xff0c;企业需要灵活且高效的生产管理软件来应对日益复杂的生产流程和市场需求。传统的软件开发模式往往需要大量的时间和资源&#xff0c;而低代码平台的出现为企业提供了一种快速开发和部署应用的新途径。低代码平台通过直观的拖放界面和…

Mirillis Action v4.40 解锁版下载与免安装教程 (专业高清屏幕录像软件)

前言 Mirillis Action!&#xff08;暗神屏幕录制软件&#xff09;专业高清屏幕录像软件&#xff0c;被誉为游戏视频三大神器之一。这款屏幕录制软件和游戏录制软件&#xff0c;拥有三大硬件加速技术&#xff0c;支持以超高清视频画质录制桌面和实况直播&#xff0c;超清视频画…

如何抢先获得抖音外卖未开放城市的区域服务商资格?附系统搭建教程!

自抖音外卖上线以来&#xff0c;抖音外卖区域服务商的申请热度与日俱增&#xff0c;连带着抖音外卖区域服务商有哪些城市开放了等多个相关话题也成为了各大本地生活服务商交流群的重点讨论对象。 从申请情况来看&#xff0c;目前&#xff0c;抖音外卖区域服务商的申请渠道主要…

五种IO模型、多路转接IO:select,poll,epoll(reactor)(技术

之前的系统部分的基础IO&#xff1a;就是冯诺依曼结果中的访问磁盘&#xff0c;用内存作为输入输出缓冲区提高效率 现在我们要说的高级IO&#xff08;input/output&#xff09;:访问的外设&#xff08;网络中就是网卡&#xff09;&#xff1a;我们的发送和接收接收其实大部分时…

奇奇怪怪的知识又增加了---给数据自动加上千分位

千分位(thousands)&#xff0c;数学领域术语&#xff0c;一种简化数学表达的方式。千分位形式&#xff0c;即从个位数起&#xff0c;每三位之间加一个逗号&#xff0c;例如&#xff0c;将7654321输出成7,654,321。 有粉丝私信问&#xff0c;投稿中经常有编辑要求给数字加上千分…