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

【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;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【总结】p50蓝图概念、面向对象思想、函数事件宏的区别

p50蓝图概念、面向对象思想、函数事件宏的区别 函数的概念&#xff08;纯虚函数和函数&#xff09;宏的概念函数、事件、宏的区别变量的概念面向对象思想&#xff08;封装、继承、多态&#xff09;类和对象的关系Object、actor、pawn、Character、component之间的区别控制权、玩…

React 论文《ReAct: Synergizing Reasoning and Acting in Language Models》阅读笔记

文章目录 1. 简介论文摘要翻译动机和主要贡献 2. REACT : SYNERGIZING *RE*ASONING *ACT*ING3. KNOWLEDGE-INTENSIVE REASONING TASKS3.1 设置3.2 方法3.3 结果和观察 4. 决策任务5. 参考资料 1. 简介 论文摘要翻译 虽然大型语言模型&#xff08;LLM&#xff09;在自然语言理…

Cilium系列-13-启用XDP加速及Cilium性能调优总结

系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于: 启用本地路由(Native Routing)完全替换 KubeProx…

RK3588平台开发系列讲解(文件系统篇)什么是 VFS

文章目录 一、什么是 VFS二、VFS 数据结构2.1、超级块结构2.2、目录结构2.3、文件索引结点2.4、打开的文件2.5、四大对象结构的关系沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 今天我们一起来瞧一瞧 Linux 是如何管理文件,也验证一下 Linux 那句口号:一切皆为文…

基于Java+Swing实现超级玛丽游戏

基于JavaSwing实现超级玛丽游戏 一、系统介绍二、功能展示三、其他系统 一、系统介绍 超级玛丽小游戏的JAVA程序&#xff0c;进入游戏后首先按空格键开始&#xff0c;利用方向键来控制的马里奥的移动&#xff0c;同时检测马里奥与场景中的障碍物和敌人的碰撞&#xff0c;并判断…

GitHub上删除项目后,IDEA分享项目到GitHub提示Remote is already on GitHub

文章目录 一、错误信息二、解决方法1.删除GitHub上的项目2.找到项目里的.git隐藏文件3.找到config文件4.打开config文件&#xff0c;删除[remote "git-test"]及下面两行内容5.继续使用IDEA分享项目到GitHub即可 一、错误信息 二、解决方法 1.删除GitHub上的项目 2.…

39.利用matlab寻找素数(matlab程序)

1.简述 MATLAB嵌套循环允许使用一个循环在另一循环内&#xff0c;下面用一个嵌套循环来把所有从1到100的素数显示出来。 2.代码 %% 学习目标&#xff1a;寻找素数 clear sum5; %求0&#xff5e;100素数之和 ss0; %用来标定是否是素数&#xff0c;0表示不是 p…

el-select控制单选还是多选

<el-form :inline"true" :model"form" class"demo-form-inline"><el-form-item><el-select v-model"form.properties_id" placeholder"请选择样品性质" clearable :multiple"multiple_properties"…

[RT-Thread]基于ART-PI的YMODEM协议在文件系统(LFS,FAT,RAMFS)下的文件传输及其注意事项

[写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,朝花夕拾故以此作文] 目录 [写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,朝花夕拾故以此作文] 前提 准备工作 内容 问题也就是注意事项 前提 准备工作 创建基于ART-PI开发板(STM32H750)…

数据库导出Excel格式的表结构

数据库导出Excel格式的表结构 你是否遇到到导出数据库里面的表结构&#xff0c;包含字段名称、类型、长度、小数、默认值、字段描述之类的需求&#xff1b;当我们去navcat里面找时发现没有&#xff0c;因为navcat没有提供这一功能&#xff0c;他只可以导出表结构的sql&#xff…

Stable Diffusion - Style Editor 和 Easy Prompt Selector 提示词插件配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132122450 Style Editor 插件&#xff1a; cd extensions git clone https://ghproxy.com/https://github.com/chrisgoringe/Styles-Editor报错&…

PHP实现首字母头像

<?php $name"哈哈"; $logoletter_avatar($name);echo <img src".$logo." style" border-radius: 50%;">;function letter_avatar($text) {$total unpack(L, hash(adler32, $text, true))[1];$hue $total % 360;list($r, $g, $b) hs…

docker数据持久化

在Docker中若要想实现容器数据的持久化&#xff08;所谓的数据持久化即数据不随着Container的结束而销毁&#xff09;&#xff0c;需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中。 &#xff08;1&#xff09;Volumes&#xff1a;…

Django架构图

1. Django 简介 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架 使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容&#xff0c;并进一步开发出全功能的 Web 服务 Django 本身…

shell 脚本

一、使用PID过滤该进程的所有信息 #! /bin/bash # Function: 根据用户输入的PID&#xff0c;过滤出该PID所有的信息 read -p "请输入要查询的PID: " P nps -aux| awk $2~/^$P$/{print $11}|wc -l if [ $n -eq 0 ];thenecho "该PID不存在&#xff01;&#xff0…

MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容测评

今天给大家带来了 MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容 100 挑战赛 的视频&#xff0c;现在充电头再以文章的形式呈现给大家&#xff0c;让大家更清楚、直白的了解这款笔记本在升级系统后的兼容性如何。 MacBook Pro 16 M1 Max 配置了 140W 的 MagSafe 充电口&…

Leetcode-每日一题【剑指 Offer 05. 替换空格】

题目 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。 示例 1&#xff1a; 输入&#xff1a;s "We are happy."输出&#xff1a;"We%20are%20happy." 限制&#xff1a; 0 < s 的长度 < 10000 解题思路 前置知识 Str…

【签到 前缀异或和】牛客多校2023 6E

题意&#xff1a; 思路&#xff1a; 签到签了半天&#xff0c;思路和正解一模一样&#xff0c;但是经典不会调细节 先不去考虑一个区间分为多段&#xff0c;先去考虑一个区间的区间和是偶数 首先很明显&#xff0c;我们只关注奇偶性&#xff0c;因此可以把所有的ai都%2&…

从价值的角度看,为何 POSE 通证值得长期看好

PoseSwap 是 Nautilus Chain 上的首个 DEX&#xff0c;基于 Nautilus Chain 也让其成为了首个以模块化构建的 Layer3 架构的 DEX。该 DEX 本身能够以 Dapp 层&#xff08;Rollup&#xff09;的形态&#xff0c;与其他应用层并行化运行。基于 Zk-Rollup PoseiSwap 具备隐私特性&…

Nacos适配人大金仓国产数据库

nacos版本2.2.0 人大金仓版本8.6.0 一、相关文件 Nacos官方文档-数据源插件https://nacos.io/zh-cn/docs/v2/plugin/datasource-plugin.html Nacos2.2.0源码https://github.com/alibaba/nacos/archive/refs/tags/2.2.0.zip 人大金仓驱动https://download.csdn.net/download/q…