【MySQL】使用C/C++连接MySQL数据库

news2025/2/24 0:23:27

【MySQL】使用C/C++连接MySQL数据库

  • 验证
  • 使用
  • select特殊点

本文目的:使用MySQL提供的CAPI完成对数据库的操作

验证

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

int main()
{
    std::cout<<"mysql cilent version: "<<mysql_get_client_info()<<std::endl;
    return 0;
}

注意:使用mysqlclient库需要指明库的位置-L和库的名称-l

[wmh@pDaD Test]$ g++ test.cc -o  test -L/lib64/mysql -lmysqlclient
[wmh@pDaD Test]$ ./test
mysql cilent version: 5.7.42

使用

MySQL-5.7API接口介绍

#include <iostream>
#include <mysql/mysql.h>
#include <string>
#include <unistd.h>
const std::string host="127.0.0.1";
const std::string user = "connection";
const std::string passwd="123456";
const std::string db="scott";
const unsigned int port = 3306;
int main()
{
    MYSQL* mysql = mysql_init(nullptr);//初始化MySQL句柄
    if(nullptr == mysql)
    {
        std::cerr<<"init MySQL error"<<std::endl;
        return 1;
    }
    if(mysql_real_connect(mysql,host.c_str(),user.c_str(),passwd.c_str(),db.c_str(),port,nullptr,0) == nullptr)//连接MySQL数据库
    {
        std::cerr<<"connect MySQL error"<<std::endl;
        return 2;
    }
    mysql_set_character_set(mysql,"utf8");//设置字符集编码

    std::string sql="update user set age='60' where id=3";
    
    int n = mysql_query(mysql,sql.c_str());//下发命令
    if(n==0) std::cout<<sql<<"success"<<std::endl;
    else std::cout<<sql<<"failed"<<std::endl;

    mysql_close(mysql);
    return 0;
}


mysql> select* from user;
+----+-----+-----------+
| id | age | name      |
+----+-----+-----------+
|  1 |  28 | 赵志敬    |
|  3 |  18 | 杨过      |
|  4 |  16 | 小龙女    |
+----+-----+-----------+

mysql> select* from user;
+----+-----+-----------+
| id | age | name      |
+----+-----+-----------+
|  1 |  28 | 赵志敬    |
|  3 |  60 | 杨过      |
|  4 |  16 | 小龙女    |
+----+-----+-----------+

select特殊点

sql执行完以后,如果是查询语句,我们要能看到数据显示出来,那么就需要mysql_store_result这个函数来保存结果到本地

MYSQL_RES *mysql_store_result(MYSQL *mysql);

获取结果行数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);
typedef struct st_mysql_field {
  char *name;                 /* Name of column */
  char *org_name;             /* Original column name, if an alias */
  char *table;                /* Table of column if column was a field */
  char *org_table;            /* Org table name, if table was an alias */
  char *db;                   /* Database for table */
  char *catalog;	      /* Catalog for table */
  char *def;                  /* Default value (set by mysql_list_fields) */
  unsigned long length;       /* Width of column (create length) */
  unsigned long max_length;   /* Max width for selected set */
  unsigned int name_length;
  unsigned int org_name_length;
  unsigned int table_length;
  unsigned int org_table_length;
  unsigned int db_length;
  unsigned int catalog_length;
  unsigned int def_length;
  unsigned int flags;         /* Div flags */
  unsigned int decimals;      /* Number of decimals in field */
  unsigned int charsetnr;     /* Character set */
  enum enum_field_types type; /* Type of field. See mysql_com.h for types */
  void *extension;
} MYSQL_FIELD;

以行为单位获取结果内容mysql_fetch_row

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

MYSQL_ROW其实就是char **.当成一个二维数组

释放结果集内存

void mysql_free_result(MYSQL_RES *result)

调用mysql_store_result返回结构体,这个函数malloc了一片内存空间来存储查询过来的数据,需要free掉

整体示例

#include <iostream>
#include <mysql/mysql.h>
#include <string>
#include <unistd.h>
const std::string host = "127.0.0.1";
const std::string user = "connection";
const std::string passwd = "123456";
const std::string db = "scott";
const unsigned int port = 3306;
int main()
{
    MYSQL *mysql = mysql_init(nullptr); // 初始化MySQL句柄
    if (nullptr == mysql)
    {
        std::cerr << "init MySQL error" << std::endl;
        return 1;
    }
    if (mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr) // 连接MySQL数据库
    {
        std::cerr << "connect MySQL error" << std::endl;
        return 2;
    }
    mysql_set_character_set(mysql, "utf8"); // 设置字符集编码

    // std::string sql="update user set age='60' where id=3";
    std::string sql = "select * from user";
    int n = mysql_query(mysql, sql.c_str()); // 下发命令
    if (n == 0)
        std::cout << sql << "success" << std::endl;
    else
        std::cout << sql << "failed" << std::endl;

    // 保存结果集转储到res中
    MYSQL_RES *res = mysql_store_result(mysql);
    if (res == nullptr)
    {
        std::cerr << "mysql_store_result_error" << std::endl;
    }
    int rows = mysql_num_rows(res);     // 获取行数
    int fields = mysql_num_fields(res); // 获取列数

    std::cout << "行: " << rows << std::endl;
    std::cout << "列:" << fields << std::endl;

    // 获取列属性
    MYSQL_FIELD *fields_array = mysql_fetch_fields(res);
    for (int i = 0; i < fields; ++i)
    {
        std::cout << fields_array[i].name << "\t"; // 打印列名
    }
    std::cout << std::endl;

    for (int i = 0; i < rows; i++)
    {
        //row可以认为是一个char** 指针
        MYSQL_ROW row = mysql_fetch_row(res);//以行为单位获取记录
        for (int j = 0; j < fields; ++j)
        {
            std::cout << row[j] << "\t";
        }
        std::cout << "\n";
    }
    std::cout << fields_array[0].db << " " << fields_array[0].table << std::endl;
    mysql_free_result(res);//释放结果集

    mysql_close(mysql);//关闭MYSQL句柄

    return 0;
}

在这里插入图片描述

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

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

相关文章

面试热题100(二叉树的右视图)

给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 树这类问题用的最多的就是递归&#xff0c;因为树具有天然的递归结构&#xff1a; 我们来分析一下题目&#xff0c;给定一棵树根结…

回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-GRU蛇群算法优化卷积门控循…

nvm安装和使用

公司不同系统用的node版本不一样&#xff0c;所以就需要安装多版本了&#xff0c;那么使用nvm来管理就大大方便了开发。 使用nvm有哪些好处呢 安装node很方便&#xff0c;只需要一条命令可以轻松切换node版本可以多版本node并存 需要注意的是安装之前先把原有的node给卸载掉…

24考研数据结构-线索二叉树的线索化

目录 数据结构&#xff1a;线索二叉树与线索化线索二叉树的定义线索化过程线索化的应用总结 5.3.2线索二叉树1. 线索二叉树的概念与作用2.线索二叉树的存储结构3. 二叉树的线索化1. 中序线索化2. 先序线索化3. 后序线索化 4. 线索树的寻找前驱后继的各种情况&#xff08;多理解…

向“数”而“深”,联想凌拓的“破局求变”底气何来?

前言&#xff1a;要赢得更多机遇&#xff0c;“破局求变”尤为重要。 【全球存储观察 &#xff5c; 热点关注】2019年2月25日&#xff0c;承袭联想集团与NetApp的“双基因”&#xff0c;联想凌拓正式成立。历经四年多的发展&#xff0c;联想凌拓已成为中国企业级数据管理领域的…

opencv-29 Otsu 处理(图像分割)

Otsu 处理 Otsu 处理是一种用于图像分割的方法&#xff0c;旨在自动找到一个阈值&#xff0c;将图像分成两个类别&#xff1a;前景和背景。这种方法最初由日本学者大津展之&#xff08;Nobuyuki Otsu&#xff09;在 1979 年提出 在 Otsu 处理中&#xff0c;我们通过最小化类别内…

C语言-------函数栈帧的创建和销毁------剖析描骨

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; &#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382;…

Talk | 新加坡国立大学博士生施宇钧:DragDiffusion-基于扩散模型的关键点拖拽图片编辑

本期为TechBeat人工智能社区第518期线上Talk&#xff01; 北京时间8月2日(周三)20:00&#xff0c; 新加坡国立大学博士生—施宇钧的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “DragDiffusion-基于扩散模型的关键点拖拽图片编辑”&#xff0c;他…

浅谈机器视觉

目录 1.什么是机器视觉 2.学习机器视觉需要掌握的知识 3.机器视觉的由来 4.机器视觉带来的福利 1.什么是机器视觉 机器视觉&#xff08;Computer Vision&#xff09;是人工智能领域中的一个分支&#xff0c;旨在通过模仿人类的视觉系统&#xff0c;使计算机能够理解和解释图…

使用uni-app的uniCloud 云数据库入门:实现一个简单的增删改查

官方云数据库文档 前置步骤使用uni-app新建一个uniCloud项目 [外链图片转存失败,源站可能有防盗官方云数据库文档]!链机制,建议将()https://uniapp.dcloud.net.cn/uniCloud/hellodb.html)] 新建表 这里我加了几个测试字段 createTime、remark、money // 文档教程: https://un…

深度强化实车部署教程

强化學習仿真實車部署 前言 这里讲一下如何部署 有两种方式部署&#xff1a; 第一种实车远程控制&#xff1a;即通过roscore中的IP设置实现远程控制&#xff1b;具体可以参考turtlebot3的PC连接turtlebot3并控制的教程&#xff1b;我使用的是这种方法&#xff1b; 第二种直…

一条命令重启supervisor所有RUNNING状态的进程

supervisorctl status | grep RUNNING | awk {print $1} | xargs -n1 supervisorctl restart

选择适合的项目管理系统,了解有哪些选择和推荐

随着科技的进步和全球竞争的加剧&#xff0c;项目管理已经成为企业成功的关键要素。为了更好地组织和监控项目&#xff0c;许多企业和组织正在采用项目管理系统(PMS)。本文将探讨项目管理系统的主要组成部分以及其在实际应用中的优势。 “项目管理系统有哪些?国际上比较常见的…

GCC版本升高到11.3后编译之前同样的C++代码出现的若干错误

目录 1 gtest-death-test.cc:1301:24: error: ‘dummy’ may be used uninitialized 2 error: ‘void* memcpy(void*, const void*, size_t)’ copying an object of non-trivial type ‘Eigen::internal::Packet4c’ 3 error: comparison is always true due to limited ra…

京东开源的、高效的企业级表格可视化搭建解决方案:DripTable

DripTable 是京东零售推出的一款用于企业级中后台的动态列表解决方案&#xff0c;项目基于 React 和 JSON Schema&#xff0c;旨在通过简单配置快速生成页面动态列表来降低列表开发难度、提高工作效率。 DripTable 目前包含以下子项目&#xff1a;drip-table、drip-table-gene…

JDK8:Stream流0基础使用与深入理解,Stream流源码分析

文章目录 一、概述二、集合操作演进对比1、JDK7传统方式2、JDK8 使用Stream3、小结 三、流实现思想1、外部迭代2、内部迭代 四、函数式编程五、流操作详解1、流的分类&#xff08;1&#xff09;中间操作&#xff08;2&#xff09;终止操作 2、构建流&#xff08;1&#xff09;基…

元素内容必须由格式正确的字符数据或标记组成

mybatis报错&#xff1a; 元素内容必须由格式正确的字符数据或标记组成 代码&#xff1a; 原因分析&#xff1a; 经过查找&#xff0c;使用 解决方案&#xff1a; 使用<![CDATA[ SQL语句 ]]> 将含有<、>、<、>的sql语句包含进去。 第二种方法&#…

STM32 低功耗学习

STM32 电源系统结构介绍 电源系统&#xff1a;VDDA供电区域、VDD供电区域、1.8V供电区域、后备供电区域。 器件的工作电压&#xff08;VDD&#xff09;2.0~3.6V 为了提高转换精度&#xff0c;给模拟外设独立供电。电压调节器为1.8V供电区域供电&#xff0c;且1.8V供电区域是电…

《MySQL》第十四篇 COUNT(*)和 COUNT(1)的区别

本文旨在介绍COUNT(*&#xff09;&#xff0c;COUNT(1&#xff09;&#xff0c;COUNT(col&#xff09;三者之间区别和使用索引的情况&#xff0c;count() 函数是用来统计行数用的&#xff0c;以下内容均是个人实践模拟结果&#xff0c;仅供参考&#xff1b; 阿里规范中详细描述…

seata 启动报错 Could not create connection to database server

文章目录 报错信息1、驱动包问题2、高版本驱动类名称问题3、url 时区问题4、驱动包位置问题 环境&#xff1a; 操作系统&#xff1a;windows 10seata版本&#xff1a;seata-server-1.6.1数据库版本&#xff1a;mysql 8.0.33 报错信息 seata启动报错com.mysql.jdbc.exception…