详解MySQL C API 相关接口(大白话就是:MySQL的c语言怎么写)

这篇具有很好参考价值的文章主要介绍了详解MySQL C API 相关接口(大白话就是:MySQL的c语言怎么写)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、C API 官方文档

关于C语言连接数据所涉及到的各种数据结构的介绍以及相关函数的使用其实在 MySQL C API 官方文档中已经给出了,我们可以通过它来快速了解并上手 MySQL C API。

详解MySQL C API 相关接口(大白话就是:MySQL的c语言怎么写),mysql,c语言,adb,linux

详解MySQL C API 相关接口(大白话就是:MySQL的c语言怎么写),mysql,c语言,adb,linux

2、初始化 MYSQL

要使用 MySQL C语言库,需要先使用 mysql_init 函数完成对 MYSQL 结构体指针的初始化工作。

MYSQL *mysql_init(MYSQL *mysql)
  • 函数返回值:失败返回 NULL。

注意:mysql_init 函数的参数以及返回值都是 MYSQL 指针类型,对于 MYSQL,大家把它类比到C语言中的文件指针来理解即可。MYSQL 和C语言文件 FILE 一样,本质上都是一个结构体。

详解MySQL C API 相关接口(大白话就是:MySQL的c语言怎么写),mysql,c语言,adb,linux

详解MySQL C API 相关接口(大白话就是:MySQL的c语言怎么写),mysql,c语言,adb,linux

MYSQL *mfp = mysql_init(nullptr); if(mfp == nullptr) { cerr << "mysql init error" << endl; return 1; } cout << "mysql init success" << endl;

详解MySQL C API 相关接口(大白话就是:MySQL的c语言怎么写),mysql,c语言,adb,linux

注意:这里用C语言的 NULL 还是C++的 nullptr 都可以,因为它们在数值上都是0;区别在于在定义时 NULL 是一个整数,而 nullptr 则是被强转为了 void* 类型。

3、连接 MySQL

初始化完毕后,我们需要使用 mysql_real_connect 函数来连接数据库。

MYSQL *
mysql_real_connect(MYSQL *mysql,       // MYSQL结构体指针对象
                   const char *host,   // mysqld服务进程所在的主机
                   const char *user,   // 登录MySQL的用户
                   const char *passwd, // 用户密码
                   const char *db,     // 要访问的数据库
                   unsigned int port,  // mysqld服务进程的端口号
                   const char *unix_socket,    // 默认设为NULL即可
                   unsigned long client_flag)  // 默认设为0即可

  • 函数返回值:失败返回0,成功返回传入的MYSQL指针。
#define HOST "127.0.0.1" //MySQL不允许远程访问 出于安全考虑 所以只可以使用本地网络 127.0.0.1
#define USER "li_zheng_yang"
#define PASS "Gaopengyan99999."
#define DBNAME "Five_in_a_row"
#define PORT 3306 //这是系统API接口默认的
if( mysql_real_connect(mysql,HOST,USER,PASS,DBNAME,PORT,NULL,0)==nullptr )//第一个参数叫句柄
    {
        cout << "connect failed" << endl;
        cout << mysql_error(mysql);//放入句柄 查看连接失败原因
        mysql_close(mysql);
        return -1;
    }

详解MySQL C API 相关接口(大白话就是:MySQL的c语言怎么写),mysql,c语言,adb,linux

设置连接字符集(使得客户端编码方式匹配)

需要注意的是,我们之前在创建数据库时默认使用的字符集是 utf8,而C语言连接数据时默认的字符集是 latin1 的(拉丁),这就会导致我们在向表中插入中文数据时,由于字符集不匹配,最终数据库中存储的数据显式出来是乱码。

所以,我们需要使用 mysql_set_character_set 函数设置连接字符集为 utf8

int mysql_set_character_set(MYSQL *mysql, const char *csname)
  • 函数返回值:返回0表示成功,非0表示失败。
int n = mysql_set_character_set(mfp, "utf8");
if(n != 0) { cout << "warning: character set fail" << endl; }

4、下发 mysql 指令

在成功连接到数据库之后,我们就可以通过 mysql_query 函数来下发 mysql 指令了。

int mysql_query(MYSQL *mysql, const char *stmt_str)
  • 函数返回值:执行成功返回0,失败返回非0。
	//增删改查 int mysql_query(MYSQL *mysql, const char *stmt_str) 这里的第二个参数前面必须加上 const
    const char* sql="insert stu values(null,'lzy',21,100,100,100);";
    //const char* sql="update stu set ch=ch-1 where sn=1;";
    //const char* sql="delete from stu where sn=1;";
    int ret=mysql_query(mysql,sql);

需要注意的是,我们在使用 mysql client 时,一条 sql 语句需要以分号结尾;但是在C语言中,sql 语句可以不用带分号,当然带上也没事。

检验是否插入成功:

select* from stu;

详解MySQL C API 相关接口(大白话就是:MySQL的c语言怎么写),mysql,c语言,adb,linux

检验是否修改成功:

详解MySQL C API 相关接口(大白话就是:MySQL的c语言怎么写),mysql,c语言,adb,linux

5、获取 mysql 查询结果(保存起来)

我们上面是对数据库执行增删改操作,它们相对来说比较简单,因为我们只需要将指令下发给数据库即可,后面的事情我们不必关心。但==如果我们执行的是查询操作,则需要通过 mysql_store_result 函数来获取查询结果==。

MYSQL_RES *mysql_store_result(MYSQL *mysql)
  • 函数返回值:失败返回 NULL,成功返回一个非空的 MYSQL_RES 类型的结构体指针。

实际上,mysql_store_result 函数会调用 MYSQL 结构体变量中的 st_mysql_methods 字段中的 read_rows 函数指针来获取查询的结果;然后将查询结果保存到 MYSQL_RES 结构体中并返回结构体指针。这样,当执行完 mysql_store_result 以后,其实数据都已经在MYSQL_RES 变量中了,我们直接从中获取即可。

需要注意的是,MYSQL_RES 是通过 malloc/new 空间的方式来保存查询结果的,所以当我们使用完毕之后,一定要记得释放 MYSQL_RES 对象,否则就会造成内存泄漏。同时,MYSQL_RES 结构体中存在查询结果的列数、列信息、行数、行内容等属性,我们需要使用对应的函数来获取这些信息。

详解MySQL C API 相关接口(大白话就是:MySQL的c语言怎么写),mysql,c语言,adb,linux

获取行与列

unsigned int mysql_num_rows(MYSQL_RES *result)

unsigned int mysql_num_fields(MYSQL_RES *result)
遍历存储结果
for(int i=0;i<num_row;i++)
    {
        //MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
        MYSQL_ROW row=mysql_fetch_row(res);
        for(int i=0;i<num_col;i++)
        {
            cout << row[i] << "\t";
        }cout << endl;
    }

当然,我们也可以通过调用 mysql_fetch_fields 函数一次获取到所有列的属性信息,然后分别打印。

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
  • 获取结果行数。
my_ulonglong mysql_num_rows(MYSQL_RES *result)

6、释放 MYSQL_RES 对象

由于 MYSQL_RES 保存查询结果的空间是通过 malloc/new 得到的,所以当我们使用完毕后需要释放掉 MYSQL_RES 对象,防止内存泄露。

void mysql_free_result(MYSQL_RES *result)
mysql_free_result(res);

7、关闭 MySQL 连接

最后,当我们使用完 MySQL 后,需要关闭 MySQL 之前建立的连接。

void mysql_close(MYSQL *sock);
mysql_close(mfp);

8、总结

使用 MySQL C API 连接数据库进行简单操作的步骤如下:文章来源地址https://www.toymoban.com/news/detail-861352.html

  1. 初始化 MYSQL 结构体指针 – mysql_init。
  2. 连接 MySQL – mysql_real_connect:需要指定数据库服务所在主机、端口以及登录mysql的用户和密码等信息。
  3. 下发 MySQL 指令 – mysql_query。
  4. 获取 MySQL 查询结果:将查询结果转储到 MYSQL_RES 中 – mysql_store_result,获取查询结果的行数 – mysql_num_rows,获取查询结果列数 – mysql_num_fields,获取单个/所有列字段的 MYSQL_FIELD 属性信息 – mysql_fetch_field/mysql_fetch_fields,获取查询结果单行的内容 (不包含属性行) – mysql_fetch_row。
  5. 释放 MYSQL_RES 对象 – mysql_free_result。
  6. 关闭 MySQL 连接 – mysql_close。
#include<bits/stdc++.h>
#include<mysql/mysql.h>
using namespace std;
#define HOST "127.0.0.1" //MySQL不允许远程访问 出于安全考虑 所以只可以使用本地网络 127.0.0.1
#define USER "root"
#define PASS "Gaopengyan99999."
#define DBNAME "Five_in_a_row"
#define PORT 3306 //这是系统API接口默认的
int main()
{
    1.初始化MySQL句柄
    MYSQL* mysql = mysql_init(nullptr);//MYSQL *mysql_init(MYSQL *mysql) 传空 那么就是堆上申请空间
    //MYSQL 和C语言文件 FILE 一样,本质上都是一个结构体 所以mysql就相当于是结构体创建的节点 
    //类似于 ListNode* node
    if(mysql==nullptr)
    {
        cout << "create fail" << endl;
        return -1;
    }


    /2.连接服务器
    /*MYSQL * mysql_real_connect(MYSQL *mysql,       // MYSQL结构体指针对象
                   const char *host,   // mysqld服务进程所在的主机
                   const char *user,   // 登录MySQL的用户
                   const char *passwd, // 用户密码
                   const char *db,     // 要访问的数据库
                   unsigned int port,  // mysqld服务进程的端口号
                   const char *unix_socket,    // 默认设为NULL即可
                   unsigned long client_flag)  // 默认设为0即可*/
    if( mysql_real_connect(mysql,HOST,USER,PASS,DBNAME,PORT,NULL,0)==nullptr )//第一个参数叫句柄
    {
        cout << "connect failed" << endl;
        cout << mysql_error(mysql);//放入句柄 查看连接失败原因
        mysql_close(mysql);
        return -1;
    }
    /3.设置客户端字符集///
    if( mysql_set_character_set(mysql,"utf8") != 0 ) //文档规定 为0则为成功 非0则失败了
    {
        cout << "set character failed" << endl;
        cout << mysql_error(mysql);//放入句柄 查看连接失败原因
        mysql_close(mysql);
        return -1;
    }
    /4.选择要操作的数据库/
    //这一步不需要进行了 我们在连接服务器的时候实则已经默认选择过了
    //mysql_select_db(mysql,DBNAME);


    //5.执行sql语句//
    //增删改查 int mysql_query(MYSQL *mysql, const char *stmt_str) 这里的第二个参数前面必须加上 const
    //const char* sql="insert stu values(null,'lzy',21,100,100,100);";
    //const char* sql="update stu set ch=ch-1 where sn=1;";
    //const char* sql="delete from stu where sn=1;";
    const char* sql="select * from stu;";
    int ret=mysql_query(mysql,sql);
    if( ret!=0 )//查询和增删改不一样 得保存数据到本地
    {
        cout << "find failed" << endl;
        cout << mysql_error(mysql);//放入句柄 查看连接失败原因
        mysql_close(mysql);
        return -1;
    }
    

    ///6.select保存结构到本地/
    MYSQL_RES *res=mysql_store_result(mysql);
    if( res == nullptr)
    {
        mysql_close(mysql);
        return -1;
    }


    //7.获取行数与列数
    //unsigned int mysql_num_fields(MYSQL_RES *result)
    //unsigned int mysql_num_rows(MYSQL_RES *result)
    int num_row=mysql_num_rows(res);//res是上面用mysql_store_result获取出来保存进去的结果
    int num_col=mysql_num_fields(res);

    //8.遍历读取数据
    for(int i=0;i<num_row;i++)
    {
        //MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
        MYSQL_ROW row=mysql_fetch_row(res);
        for(int i=0;i<num_col;i++)
        {
            cout << row[i] << "\t";
        }cout << endl;
    }

    //9.释放结果集///
    mysql_free_result(res);
    
    /10.关闭连接/
    mysql_close(mysql);
}

到了这里,关于详解MySQL C API 相关接口(大白话就是:MySQL的c语言怎么写)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式大白话——策略模式

    一、概述 ​ 从名字上来看,此设计模式的核心是 策略 二字,所谓策略,说白了就是能够针对不同的情况随机应变。接下来我将带你领略策略模式的魅力 二、场景举例 场景描述 ​ 现在有一个游戏,游戏中有各种各样的鸭子,有些鸭子是呱呱叫会用翅膀飞,有些鸭子是嘎嘎

    2024年02月16日
    浏览(44)
  • 大白话聊聊“深度学习”和“大模型”

    1950年图灵发表论文《计算机器与智能》( Computing Machinery and Intelligence),提出了“机器智能”(Machine Intelligent)的概念,并且提出了著名的“图灵测试”的方法来判断机器是否有智能。 1956年,达特茅斯会议,“人工智能”(Artificial Intelligent)概念被首次提出,人工智能作

    2024年02月02日
    浏览(61)
  • 用大白话举例子讲明白云计算

    前几天王坚院士在2023云栖大会上发表了关于云计算的演讲,听得我是热血沸腾,王院士称AI和云计算的结合是“云计算的第三次浪潮”,对此我深表认同。但是身边的很多朋友还不知道云计算是什么意思,有些人还认为百度云和百度云盘是一个东西,下面我用大白话举例说明

    2024年02月04日
    浏览(52)
  • 大白话理解-微信小程序获取授权

    微信用户授权,才可以操作微信官方的某些接口。 简单来说就是:微信定义了很多接口,然后他们认为有一部分是涉及到用户使用安全的,所以把这一部分划分了出来,然后这一部分按照功能来拆开各种范围。于是有了scope列表的东西,scope翻译为中文是范围的意思。(定位属于

    2024年02月02日
    浏览(39)
  • 设计模式大白话——适配器模式

    ​ 适配器其实非常好理解,放到生活中来,我们身边处处都有这样的例子,最常见的是用的比较多的各种转接线(如:USB 转 Type-C),有了这个“适配器”,我们就能够将电脑和手机等设备相进行连接,而不需要改动电脑/手机的原有接口。 ​ 回到编程的世界中,假设我们的

    2024年02月10日
    浏览(49)
  • React底层原理分析(简单大白话版本)

    react包 react-dom包 react-reconciler包 scheduler包 Fiber对象 diff算法 深度优先遍历  堆排序 链表,栈操作 react合成事件

    2024年01月20日
    浏览(48)
  • Lighting Network(闪电网络)大白话解析

    通道(Channel),通过在主网宣布通道建立,而后交易双方转至链下交易,把多次交易在链下完成,不占用主网资源,交易完成后在主网广播最终交易结果,无需更改主网机制即可实现吞吐量的提高。 “通道”是一个逻辑上的概念,实际使用过程中并没有“通道”,即使在数据传

    2024年02月04日
    浏览(44)
  • 用大白话举例子讲明白区块链

    什么是区块链?网上这么说: 区块链是一种分布式数据库技术,它以块的形式记录和存储交易数据,并使用密码学算法保证数据的安全性和不可篡改性。每个块都包含了前一个块的哈希值和自身的交易数据,形成了一个不断增长的链条。 区块链的特点包括: 分布式:区块链

    2024年02月04日
    浏览(57)
  • 别样的git学习--大白话学git

    希望用更加口语化的语言向大家讲述git 的魅力 1、Git-stash (贮存) 想象一下,你正在写一封重要的邮件,但突然你的老板告诉你需要立即处理另一个紧急任务。你还没完成邮件,不想丢失已写的内容,但你也需要一个干净的工作空间来处理新的任务。在这种情况下,Git 的

    2024年01月24日
    浏览(51)
  • 用大白话来讲讲多线程的知识架构

    感觉多线程的知识又多又杂,自从接触java,就在一遍一遍捋脉络和深入学习。现在将这次的学习成果展示如下。 什么是多线程? 操作系统运行一个程序,就是一个线程。同时运行多个程序,就是多线程。即在同一时间,并行做多件事。 “并行”是相对于我们这些用户来说的

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包