一、代码实现

1、若在C++代码中写#include显示该库没安装,就先安装这个库 sudo yum install mysql-community-devel.x86_64

2、新建myDB.h文件

#include

#include

#include

using namespace std;

class MyDB

{

public:

MyDB();

~MyDB();

bool initDB(string host, string user, string pwd, string db_name);

bool exeSQL(string sql);

private:

MYSQL *connection;

MYSQL_RES *result;

MYSQL_ROW row;

};

3、新建myDB.cpp

#include

#include

#include

#include "myDB.h"

using namespace std;

MyDB::MyDB()

{

connection = mysql_init(NULL); // 初始化数据库连接变量

if(connection == NULL)

{

cout << "Error:" << mysql_error(connection);

exit(1);

}

}

MyDB::~MyDB()

{

if(connection != NULL) // 关闭数据库连接

{

mysql_close(connection);

}

}

bool MyDB::initDB(string host, string user, string pwd, string db_name)

{

// 函数mysql_real_connect建立一个数据库连接

// 成功返回MYSQL*连接句柄,失败返回NULL

connection = mysql_real_connect(connection, host.c_str(), user.c_str(), pwd.c_str(), db_name.c_str(), 0, NULL, 0);

if(connection == NULL)

{

cout << "Error:" << mysql_error(connection);

exit(1);

}

return true;

}

bool MyDB::exeSQL(string sql) {

cout<

if(mysql_query(connection, sql.c_str())) { // mysql_query()执行成功返回0,失败返回非0值

cout << "Query Error:" << mysql_error(connection);

return false;

}

else {

result = mysql_use_result(connection); // 获取结果集

while(row = mysql_fetch_row(result)) { // 不断获取下一行

vector rowResult;

// mysql_num_fields()返回结果集中的列数

for(int j = 0; j < mysql_num_fields(result); ++j) {

cout << row[j] << " ";

}

cout << endl;

}

// 释放结果集的内存

mysql_free_result(result);

}

cout<

return true;

}

4、在main文件中测试

void testDB(){

MyDB db;

db.initDB("localhost", "root", "0709", "EpidemicDatabase");

db.exeSQL("INSERT INTO User VALUES(\"452223199707090000\", \"catnip\", \"0709\", false)");

}

5、在mysql中查看对应的数据库和表格

插入sql执行成功

二、数据结构

1、MYSQL_RES

typedef struct st_mysql_res

{

my_ulonglong row_count; // 结果集的行数

unsigned int field_count, current_field; // 结果集的列数,当前列

MYSQL_FIELD *fields; // 结果集的列信息

MYSQL_DATA *data; // 结果集的数据

MYSQL_ROWS *data_cursor; // 结果集的光标

MEM_ROOT field_alloc; // 内存结构

MYSQL_ROW row; // 非缓冲的时候用到

MYSQL_ROW current_row; // 当前行。mysql_store_result时会用到

unsigned long *lengths; // 每列的长度

MYSQL *handle; // mysql_use_result会用。

my_bool eof; // 是否为行尾

} MYSQL_RES;

2、MYSQL_ROWS

typedef struct st_mysql_rows

{

struct st_mysql_rows *next; //列表的行

MYSQL_ROW data;

} MYSQL_ROWS; //mysql的数据的链表节点。可见mysql的结果集是链表结构

3、MYSQL_DATA

typedef struct st_mysql_data

{

my_ulonglong rows;

unsigned int fields;

MYSQL_ROWS *data;

MEM_ROOT alloc;

} MYSQL_DATA; // 数据集的结构

4、MYSQL_FIELD

typedef struct st_mysql_field

{

char *name; // 列名称

char *table; //如果列是字段,列表

char *def; //默认值(由mysql_list_fields设置)

enum enum_field_types type; //类型的字段。Se mysql_com。h的类型

unsigned int length; //列的宽度

unsigned int max_length; //选择集的最大宽度

unsigned int flags; //Div标记集

unsigned int decimals; //字段中的小数位数

} MYSQL_FIELD; //列信息的结构

5、USED_MEM

typedef struct st_used_mem //结构为once_alloc

{

struct st_used_mem *next; //下一个块使用

unsigned int left; //记忆留在块

unsigned int size; //块的大小

} USED_MEM; //内存结构

6、MEM_ROOT

typedef struct st_mem_root

{

USED_MEM *free;

USED_MEM *used;

USED_MEM *pre_alloc;

unsigned int min_malloc;

unsigned int block_size;

void (*error_handler)(void);

} MEM_ROOT; //内存结构

三、获取数据的API

1、MYSQL_RES *mysql_store_result(MYSQL *mysql)

(1)通过检查mysql_store_result()是否返回0,可检测查询是否没有结果集。

(2)一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。

(3)可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。

(4)一旦完成了对结果集的操作,必须调用mysql_free_result()。

2、MYSQL_RES *mysql_use_result(MYSQL *mysql)

初始化结果集检索

(1)使用mysql_use_result()时,必须执行mysql_fetch_row(),直至返回NULL值,否则,未获取的行将作为下一个检索的一部分返回。

(2)不能对结果集用mysql_data_seek()、mysql_row_seek()、mysql_row_tell()、mysql_num_rows()或mysql_affected_rows(),也不应发出其他查询,直至mysql_use_result()完成为止。(但是,提取了所有行后,mysql_num_rows()将准确返回提取的行数)。

(3)一旦完成了对结果集的操作,必须调用mysql_free_result()

3、MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。

//假设mysql已经连接好

MYSQL_RES* result = mysql_store_result(mysql);

if (result == NULL) {

return;

}

MYSQL_ROW row;

int num_fields = mysql_num_fields(result);

while ((row = mysql_fetch_row(result))) {

long *lengths = mysql_fetch_lengths(result);

for(int i = 0; i < num_fields; i++) {

printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");

}

printf("/n");

}

4、MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)

获取列的信息

(1)重复调用该函数,以检索关于结果集中所有列的信息。无剩余字段时,mysql_fetch_field()返回NULL。

5、MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)

取得列的信息

(1)对于结果集,返回所有MYSQL_FIELD结构的数组。每个结构提供了结果集中1列的字段定义。

int num_fields = mysql_num_fields(result);

MYSQL_FIELD *fields = mysql_fetch_fields(result);

for(int i = 0; i < num_fields; i++) {

printf("Field %u is %s/n", i, fields[i].name);

}

6、void mysql_free_result(MYSQL_RES *result)

释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。

释放完成后,不要尝试访问结果集。

centos c++ mysql_腾讯云Linux CentOS C++连接MySQL相关推荐

  1. 云服务器 cvm mysql_腾讯云CVM如何安装搭建MySQL

    本文档使用 Windows Server 2012 R2 示例,介绍搭建 MySQL 5.5 的具体步骤. 通常情况下 Windows 系统经常使用 SQL Server 数据库,但由于 SQL Se ...

  2. 腾讯云Linux服务器搭建(三) Mysql 8.0.11的安装和设置

    新拿到的主机,里面什么都没有.从数据库开始安装.先用 yum list mysql* 查看了一下,没有任何Mysql相关的内容.然后开是安装,yum install mysql-server mysq ...

  3. 腾讯云linux数据盘格式化,腾讯云服务器Centos挂载数据盘的方法

    腾讯云服务器Centos挂载数据盘的方法 发布时间:2020-08-24 08:24:30 来源:脚本之家 阅读:138 作者:逐风 栏目:服务器 第一.检查硬盘设备是否有数据盘 # 先执行 fdis ...

  4. 远程访问 Linux 服务器中的 redis 数据库(腾讯云服务器 CentOS 8.0)

    远程访问 Linux 服务器中的 redis 数据库(腾讯云服务器 CentOS 8.0) 1. 开放腾讯云服务器防火墙端口 2. 修改 redis.conf 文件配置 3. 设置服务器防火墙状态 4 ...

  5. 【Centos 8】【Centos 7】腾讯云服务器 安装 docker

    前言 CentOS Linux release 8.2 CentOS Linux release 7.9 yum源 腾讯云服务器Centos 8.Centos 7版本上的yum中包含了docker,无 ...

  6. 阿里云linux centos 一键部署web环境--图文详解

    阿里云linux centos 一键部署web环境--图文详解 标签: linux阿里云一键部署 2017-04-15 12:28 386人阅读 评论(0) 收藏 举报  分类: linux(11)  ...

  7. 腾讯云Linux服务器如何安装Discuz个人论坛?

    操作场景 Discuz! 是全球成熟度最高.覆盖率最大的论坛网站软件系统之一,被200多万网站用户使用.您可通过 Discuz! 搭建论坛,本文档介绍在腾讯云云服务器上搭建 Discuz! 论坛及其所 ...

  8. 拉取ftp服务器上的文件_winscp和云服务器,2步实现winscp将文件上传到腾讯云Linux云服务器...

    WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端.同时支持SCP协议,它的主要功能就是在本地与远程计算机间安全的复制文件.与使用FTP上传代码相比,通过WinSCP可以直接使 ...

  9. 腾讯云linux服务器怎么使用图形化界面_winscp使用方法,winscp使用方法详细说明...

    WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端.同时支持SCP协议,它的主要功能就是在本地与远程计算机间安全的复制文件.与使用FTP上传代码相比,通过WinSCP可以直接使 ...

最新文章

  1. 【事务】特性、安全保障及实现
  2. boost::mp11::mp_replace_if_q相关用法的测试程序
  3. Spring State Machine:它是什么,您需要它吗?
  4. 内存中数据模型和大数据持久性
  5. 诗与远方:无题(二十六)- 曾经给一个妹子写的一首诗
  6. python中字典的find_python中的字典
  7. SQL Server 数据库角色简介
  8. 如何修改WP文章字体格式、字号大小、字体颜色
  9. oracle 存储过程给另一个用户的权限问题
  10. 基于JSP+SERVLET的新闻发布系统(一)
  11. Win10如何安装自带的XPS Viewer查看器
  12. java 电子签章 开源_java操作pdf制作电子签章 - CSDN博客
  13. 1186: 零起点学算法93——改革春风吹满地(C)
  14. 使用Typora列表嵌套列表,回车无法返回上一级列表的状态
  15. 国家电网一二次融合配电终端(FTU)发展新方向馈线自动化:具备集中型馈线自动化/就地型馈线自动化包括电压时间型、电压电流型、自适应综合型)及零序电流,零序电压或外施信号法的单相接地故障选线功能
  16. ECCV22 最新54篇论文分方向整理|包含Transformer、图像处理、人脸等(附下载)...
  17. 查看Ubuntu的版本号,并添加国内镜像源
  18. 推荐系统实战——自动化构建用户以及物料画像
  19. AddressBook 地址簿  (电话簿) 访问与修改-IOS开发
  20. 新型知识管理工具-Baklib,比起语雀我更喜欢它

热门文章

  1. python大规模获取豆瓣影评_python爬取豆瓣电影排行榜(requests)
  2. 基于花季A传媒ABP落地领域驱动设计-02.聚合和聚合根的最佳实践和原则
  3. 安卓Apk安装过程,社招面试心得
  4. Win10输入法无法选择,右下角出现叉号,提示IME被禁用
  5. 亿级流量实验平台设计与实践
  6. 5.6.3 分组总计查询
  7. PS 2019 Mac版 自学入门系列(十二)—— 应用滤镜
  8. 4、编写程序,根据用户输入的数字转换成相应的中文的大写数字。例如,1.23转换为“壹点贰叁”。
  9. 两分钟研究透idea中Git文件的颜色,绿红蓝白灰
  10. intel opcode