MySQL(十二) Connector/C

news2024/12/24 21:02:33

首先可以在mysql的官网下载对应的库文件,这里就不演示了

1. 测试

通过 mysql_get_client_info() 函数,来验证我们的引入是否成功

#include <iostream>
#include <mysql/mysql.h>

int main()
{

    std::cout << "mysql version:" << mysql_get_client_info() << std::endl;
    return 0;
}

makefile文件

mytest:test.cc
	g++ -o mytest test.cc -std=c++11 -L/lib64/mysql -lmysqlclient
.PHONY:clean
clean:
	rm -f mytest

L:库文件所在位置
小L:库文件名,去掉lib和.so
由于默认头文件路径是/usr/include,而mysql.h在/usr/include/mysql/里,所以在include的时要
#include<mysql/mysql.h>,如果只#include<mysql.h>,那么在执行编译命令是就要加对应的头文件所在路径
大i:头文件所在路径-I/usr/include/mysql

2.mysql接口介绍

初始化mysql_init()

要使用库,必须先进行初始化!

MYSQL *mysql_init(MYSQL *mysql);
如: MYSQL *mfp = mysql_init(NULL)

初始化完毕之后,必须先链接数据库,在进行后续操作。

(mysql网络部分是基于TCP/IP的)

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);
//建立好链接之后,获取英文没有问题,如果获取中文是乱码:
//设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8");

第一个参数 MYSQL是 C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。mysql_real_connect函数中各参数,基本都是顾名思意。

下发mysql命令mysql_query

int mysql_query(MYSQL *mysql, const char *q);

第一个参数上面已经介绍过,第二个参数为要执行的sql语句,如“select * from table”。
在进行增删改的时候可以直接在q上写上相应的语句即可,而查select会麻烦一些

int main()
{

    //std::cout << "mysql version:" << mysql_get_client_info() << std::endl;
    MYSQL* my = mysql_init(nullptr);
    if(my == nullptr)
    {
        cerr << "init error" << endl;
        exit(1);
    }
    mysql_set_character_set(my,"utf8");
    if (mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        cerr << "mysql_real_connect error" << endl;
        exit(2);
    }
    cout << "mysql_real_connect success" << endl;
    int n = mysql_query(my,"insert into user values(3,'bb','女')");
    mysql_close(my);
    return 0;
}

获取执行结果mysql_store_result

MYSQL_RES *mysql_store_result(MYSQL *mysql);

该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 执行完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api基本就是读取MYSQL_RES 中的数据。

理解MYSQL_RES*

看此图MYSQL_RES*可以看作一个存储二级指针的一个数组

获取结果行数mysql_num_rows

my_ulonglong mysql_num_rows(MYSQL_RES *res);

获取结果列数mysql_num_fields

unsigned int mysql_num_fields(MYSQL_RES *res);

获取列名mysql_fetch_fields

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

例如

int fields = mysql_num_fields(res);
MYSQL_FIELD *field = mysql_fetch_fields(res);
int i = 0;
for(; i < fields; i++){
cout<<field[i].name<<" ";
} c
out<<endl;

获取结果内容mysql_fetch_row

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.就当成一个二维数组来用吧。

 MYSQL_ROW line;
    for(int i = 0;i < row;i++)
    {
        line = mysql_fetch_row(mr);
        for(int j = 0;j < colnum;j++)
        {
            cout << line[j] << '\t';
        }
        cout << endl;
    }

关闭mysql链接mysql_close

void mysql_close(MYSQL *sock);

它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.就当成一个二维数组来用吧。

int main()
{

    //std::cout << "mysql version:" << mysql_get_client_info() << std::endl;
    MYSQL* my = mysql_init(nullptr);
    if(my == nullptr)
    {
        cerr << "init error" << endl;
        exit(1);
    }
    mysql_set_character_set(my,"utf8");
    if (mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        cerr << "mysql_real_connect error" << endl;
        exit(2);
    }
    cout << "mysql_real_connect success" << endl;
    int n = mysql_query(my,"select * from user");
    MYSQL_RES* mr = mysql_store_result(my);
    if(mr == nullptr)
    {
        cerr << "select error" << endl;
        exit(3);
    }
    my_ulonglong row = mysql_num_rows(mr);
    unsigned int colnum = mysql_num_fields(mr);
    cout << "row:" << row << "   " << "fields:" << colnum << endl;
    MYSQL_FIELD* fileds = mysql_fetch_field(mr);
    for(int i = 0;i < colnum;i++)
    {
        cout << fileds[i].name << '\t';
    }
    cout << endl;
    MYSQL_ROW line;
    for(int i = 0;i < row;i++)
    {
        line = mysql_fetch_row(mr);
        for(int j = 0;j < colnum;j++)
        {
            cout << line[j] << '\t';
        }
        cout << endl;
    }
    

    mysql_close(my);
    return 0;
}

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

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

相关文章

帕友的锻炼小建议,助您重拾健康与活力

帕金森病&#xff0c;作为一种常见的神经系统退行性疾病&#xff0c;给患者的生活带来了诸多困扰。然而&#xff0c;通过科学的锻炼方法&#xff0c;我们可以有效缓解病情&#xff0c;提高生活质量。 一、有氧运动&#xff1a;提升心肺功能 对于帕金森病患者来说&#xff0c;适…

CentOS 7基础操作01_安装CentOS 7操作系统

1、实验环境 因为 Windows图形界面占用系统资源较高,所以公司准备将面向互联网的网站,数据库等重要应用基于Linux平台部署&#xff0c;并计划于近期将服务器安装开源免费的 CentOS 系统。进行前期准备工作时,需要公司的系统管理员尽快掌握 CentOS 系统的安装过程 2、需要描述 …

方差和标准差的区别

标准差和方差都是用来衡量随机变量的离散程度的统计量&#xff0c;它们之间有以下区别&#xff1a; 方差&#xff08;Variance&#xff09;&#xff1a; 方差是衡量随机变量离其均值的离散程度的度量。它是各个数据与其平均值之差的平方和的平均值。方差的公式为&#xff1a;…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt + uniapp 驾校预约平台 的设计与实现

一.项目介绍 系统角色&#xff1a;管理员、教练、学员 小程序(仅限于学员注册、登录)&#xff1a; 查看管理员发布的公告信息 查看管理员发布的驾校信息 查看所有教练信息、预约(需教练审核)、评论、收藏喜欢的教练 查看管理员发布的考试信息、预约考试(需管理…

javaweb基础之Ajax请求

大家好&#xff0c;这里是教授.F 目录 介绍&#xff1a; 原理图&#xff1a; 原生Ajax&#xff1a; JQuery的Ajax&#xff1a; 介绍&#xff1a; 是一种浏览器异步发起请求&#xff08;指定发那些数据&#xff09;&#xff0c;局部更新页面的技术 原理图&#xff1a; 原生…

MySQL -- SQL笔试题相关

1.银行代缴花费bank_bill 字段名描述serno流水号date交易日期accno账号name姓名amount金额brno缴费网点 serno: 一个 BIGINT UNSIGNED 类型的列&#xff0c;作为主键&#xff0c;且不为空。该列是自动增量的&#xff0c;每次插入新行时&#xff0c;都会自动递增生成一个唯一的…

【SQL学习进阶】从入门到高级应用(七)

文章目录 ✨数据处理函数✨if函数✨cast函数✨加密函数 ✨分组函数✨max✨min✨avg✨sum✨count✨分组函数组合使用✨分组函数注意事项 ✨分组查询✨group by✨having✨组内排序 ✨总结单表的DQL语句 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f495;欢迎来到我…

3、css3 手写nav导航条(互相学习)

效果例图&#xff1a; 1、首先呈现的是html代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

Optional类

一、概述 泛型类、java8引进的、java.util包里 二、作用 解决空指针异常带来的不便 三、做法 将对象封装为一个Optional对象&#xff0c;如果封装的对象为空&#xff08;即该对象不存在&#xff09;&#xff0c;可以使用默认值和或者执行默认操作 四、方法 1、empty() 创…

2024年艺术鉴赏与科学教育国际会议(ICAASE 2024)

2024年艺术鉴赏与科学教育国际会议 2024 International Conference on Art Appreciation and Science Education 【1】会议简介 2024年艺术鉴赏与科学教育国际会议是一场集艺术、科学和教育于一体的国际性学术盛会。本次会议旨在推动艺术鉴赏与科学教育领域的深入交流与合作&am…

通过 CXCR4 靶向纳米线修补细胞表面以抑制癌症转移

引用信息 文 章&#xff1a;Cell surface patching via CXCR4-targeted nanothreads for cancer metastasis inhibition. 期 刊&#xff1a;Nature Communications&#xff08;影响因子&#xff1a;16.6&#xff09; 发表时间&#xff1a;2024/3/29 作 者&#xff1…

语义分割——数据增广

前言 在进行语义分割的时候&#xff0c;我们的数据集有时候不够用&#xff0c;常常需要进行数据增广。 比较常用的数据增广方法(包括旋转&#xff0c;上下翻转&#xff0c;左右翻转&#xff0c;裁剪&#xff0c;调整对比度&#xff0c;调整饱和度&#xff0c;调整亮度&#xf…

【文献阅读】应用人工智能在Simulink中开发软件

参考文献&#xff1a;《AI用于Simulink模型的降阶方法和应用场景》Mathworks在2024年MATLAB XEPO大会的演讲 文章目录&#xff1a; 1、模型框架 2、数据准备 3、AI建模 4、仿真和测试 5、部署应用 Tips&#xff1a;降阶模型&#xff08;Reduced Order Modeling&#xff0…

Centos 7 安装刻录至硬件服务器

前言 在日常测试中&#xff0c;会遇到很多安装的场景&#xff0c;今天给大家讲一下centos 7 的安装&#xff0c;希望对大家有所帮助。 一.下载镜像 地址如下&#xff1a; centos官方镜像下载地址https://www.centos.org/download/ 按照需求依次点击下载 二.镜像刻录 镜像刻…

Redis学习笔记【基础篇】

SQL vs NOSQL SQL&#xff08;Structured Query Language&#xff09;和NoSQL&#xff08;Not Only SQL&#xff09;是两种不同的数据库处理方式&#xff0c;它们在多个维度上有所差异&#xff0c;主要区别包括&#xff1a; 数据结构: SQL&#xff08;关系型数据库&#xff09;…

修改element-ui el-radio颜色

修改element-ui el-radio颜色 需求效果图代码实现 小结 需求 撤销扣分是绿色&#xff0c;驳回是红色 效果图 代码实现 dom <el-table-columnlabel"操作"width"200px"><template v-slot"scope"><el-radio-group v-model"s…

基础—SQL—DQL(数据查询语言)分页查询

一、引言 上一篇博客学习了排序查询&#xff0c;这次来讲查询的最后一个部分&#xff1a;分页查询。 涉及到的关键字是&#xff1a;LIMIT 。 二、DQL—分页查询 对于分页&#xff0c;不管以后做的是传统的管理系统还是做互联网的项目&#xff0c;基本上都会遇到分页查询的操…

入门flask:Python后端开发的首选框架

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;从零开始学习弗拉斯克 二、弗拉斯克的微框架哲学 三、弗拉斯克的核心…

vs code便利手册

vs code终端改造 改造颜色 未改造前&#xff1a; 改造后&#xff1a; 改造方法&#xff1a;VS Code 终端美化成自己喜欢的样子_vs code 终端样式-CSDN博客

如何备份RDK X3(旭日X3派)的 SD卡镜像

该方法可以在Ubuntu的开发机上生成一个img镜像&#xff0c;后续可以直接使用rufus软件烧录备份好的镜像。 Step 1&#xff1a;在Ubuntu的开发机上安装gparted软件 如果安装失败则需要为您的Ubuntu开发机换源&#xff0c;这里推荐阿里源&#xff1a;https://developer.aliyun.…