MySQL 如何用C语言连接

  ✨✨✨励志成为超级技术宅  ✨✨✨

        本文主要讲解在Linux服务器上,如何使用c语言MySQL库的接口来对MySQL数据库进行操作,如果没有服务器安装MySQL,也可以先学学看怎么用c语言mysql库的接口,还是比较容易的了。(●☌◡☌●)。那么开始讲解吧!

一.部分接口讲解 

         我们先来看接口的定义,这部分比较无聊,我们也可以先看第二部分的代码使用 ,再返回来看看。      

1.MYSQL *mysql_init(MYSQL *mysql)

作用:对数据库进行初始化,要使用库,必须先进行初始化

参数:MYSQL *mysql:这是一个指向 MYSQL 结构体的指针。如果传入 NULLmysql_init 会分配一个新的 MYSQL 结构体并返回其指针。如果传入一个非 NULL 的指针,mysql_init 会初始化这个已经存在的 MYSQL 结构体。我们一般都是直接传入NULL,如 MYSQL * mysql=mysql_init(nullptr);这样使用就行。

返回值:

  • 成功时,mysql_init 返回一个指向 MYSQL 结构体的指针。这个指针可以用于后续的数据库连接操作。
  • 失败时,返回 NULL。这通常发生在内存分配失败的情况下。

2.MYSQL *mysql_real_connect()

完整接口: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),参数非常复杂我们一个个讲解。

作用:连接mysql服务器。

参数:

  1. MYSQL *mysql这是一个已经通过 mysql_init 初始化的 MYSQL 连接句柄。
  2. const char *host:MySQL 服务器的主机名或 IP 地址。可以是 NULL 或 "localhost",表示连接到本地服务器。
  3. const char *user:用于连接数据库的用户名。
  4. const char *passwd:对应用户的密码。
  5. const char *db:要连接的数据库名,也可以置为空,后面调用其他接口选择。
  6. unsigned int port:MySQL 服务器的端口号。如果设置为 0,则使用默认端口(通常是 3306)。
  7. const char *unix_socket:UNIX 套接字文件的路径,我们通常设置为 NUll,使用默认的 UNIX 套接字文件路径。
  8. unsigned long client_flag:客户端标志,用于指定连接选项。可以是多个标志的按位或组合,比如 CLIENT_INTERACTIVECLIENT_FOUND_ROWS 等,我们通常置为0就行。

返回值: 

  • 成功时,mysql_real_connect 返回一个指向 MYSQL 结构体的指针(与传入的 mysql 参数相同)。这个指针表示一个成功的数据库连接,可以用于后续的数据库操作。
  • 失败时,返回 NULL。此时,可以通过调用 mysql_error 函数来获取关于连接失败的更多信息。

3. int mysql_set_character_set(MYSQL *mysql, const char *csname)

作用:设置数据库字符集

参数:1.初始化的 MYSQL 连接句柄,2要设计的字符集名称

返回值:

  • 成功时,mysql_set_character_set 返回 0
  • 失败时,返回非零值。此时,可以通过调用 mysql_error 函数来获取关于设置字符集失败的更多信息。

4.int mysql_query(MYSQL *mysql, const char *q)

作用:执行sql语句

参数:1.初始化的 MYSQL 连接句柄,2要执行的sql语句

返回值:

  • 成功时, 返回 0
  • 失败时,返回非零值。此时,可以通过调用 mysql_error 函数来获取关于设置字符集失败的更多信息。

5.void mysql_close(MYSQL*mysql)

作用:关闭连接,释放句柄

参数:初始化的 MYSQL 连接句柄

 二.代码使用

   首先我们先登入MySQL客户端查看并选择我们需要连接的数据库

        这里我们选择gobang数据库进行连接。

        我们直接看代码来学学看怎么使用:

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

#define HOST "127.0.0.1"
#define PORT 3306
#define USER "root"
#define PASS "147258Ll!"
#define DBNAME "gobang"
int main()
{
    //1. 初始化mysql句柄
    // MYSQL *mysql_init(MYSQL *mysql);
    MYSQL * mysql=mysql_init(nullptr);


    //2. 连接服务器
    // MYSQL *mysql_real_connect(mysql, host, user, pass, dbname, port, unix_socket, flag);
    mysql_real_connect(mysql,HOST,USER,PASS,DBNAME,PORT,nullptr,0);


     //3. 设置客户端字符集
    // int mysql_set_character_set(mysql, "utf8");
    int ret=mysql_set_character_set(mysql,"utf8");


    //4. 选择要操作的数据库
    //之前选择了数据库这里可以不写
    // int mysql_select_db(mysql, dbname)
    //mysql_select_db(mysql, DBNAME);

      //5. 执行sql语句
    // int mysql_query(MYSQL *mysql,  char *sql);
    const char *sql = "insert stu values(100,'xixi','17');";
    mysql_query(mysql,sql);

    //6.关闭连接,释放句柄
    mysql_close(mysql);
    return 0;
}

        这里我们通过c语言接口连接gobang数据库,并向stu表插入一条数据(100,xixi,17)。

        我们先来看看表结构:

        表中有三个属性id,name,age,运行上面的代码我们来看看结果 。

 

        可以看到插入成功。但是这里我们执行的SQL语句并不需要结果数据,如果是select语句需要返回结果集,我们要看到对应的结果那么应该如何使用?这里我们还要学学其他接口

三.与结果集有关的其他接口

1.MYSQL_RES *mysql_store_result(MYSQL *mysql)

作用:讲sql语句执行的保存结果到本地

参数:mysql句柄

返回值:指向结果集的指针,失败为空

2.int mysql_num_rows(MYSQL_RES *res)和int mysql_num_fields(res);

作用:获取结果集的行数和列数

参数:结果集指针

返回值:行数和列数

3.MYSQL_ROW  mysql_fetch_row(MYSQL_RES*res)

作用:按行遍历结果集

参数:结果集指针

返回值:MYSQL_ROW ,本质是二级指针char* *,指向一行结果集的一条记录,访问过后会自动移向下一条记录。

        我们在使用过程会通常会讲上面的接口一起结合起来遍历结果集。 

四.代码使用 

我们再来看看包含所有接口的代码:

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

#define HOST "127.0.0.1"
#define PORT 3306
#define USER "root"
#define PASS "147258Ll!"
#define DBNAME "gobang"
int main()
{
    //1. 初始化mysql句柄
    // MYSQL *mysql_init(MYSQL *mysql);
    MYSQL * mysql=mysql_init(nullptr);


    //2. 连接服务器
    // MYSQL *mysql_real_connect(mysql, host, user, pass, dbname, port, unix_socket, flag);
    mysql_real_connect(mysql,HOST,USER,PASS,DBNAME,PORT,nullptr,0);


     //3. 设置客户端字符集
    // int mysql_set_character_set(mysql, "utf8");
    int ret=mysql_set_character_set(mysql,"utf8");


    //4. 选择要操作的数据库
    // int mysql_select_db(mysql, dbname)
    mysql_select_db(mysql, DBNAME);

      //5. 执行sql语句
    // int mysql_query(MYSQL *mysql,  char *sql);
    const char *sql = "insert stu values(100,'xixi','17');";
    mysql_query(mysql,sql);
    const char*sql2="select *from stu;";
    mysql_query(mysql,sql2);



    //6. 如果sql语句是查询语句,则需要保存结果到本地
    // MYSQL_RES *mysql_store_result(MYSQL *mysql)
     MYSQL_RES *res=mysql_store_result(mysql);



     //7. 获取结果集中的结果条数
    // int mysql_num_rows(MYSQL_RES *res);
    // int mysql_num_fields(MYSQL_RES *res);
    int rows_num=mysql_num_rows(res);
    int cols_num=mysql_num_fields(res);


    //8. 遍历保存到本地的结果集
    for(int i=0;i<rows_num;i++)
    {
        MYSQL_ROW row = mysql_fetch_row(res);
        for(int j=0;j<cols_num;j++)
        {
            std::cout<<row[j]<<std::endl;
        }
    }

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

运行结果:

        用c语言连接数据库就讲解到这了,我们只要按流程依此使用相关接口就行了,还是挺简单的吧,感觉有帮助还请点个赞了,这真的很重要!(๑•́ ₃ •̀๑)/

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

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

相关文章

雨晨 24H2 Windows 11 IoT ltsc 2024 IE 极简版 26100.2222

文件: 雨晨 24H2 Windows 11 IoT ltsc 2024 IE 极简版 26100.2222 install.wim 大小: 1737837354 字节 修改时间: 2024年11月12日, 星期二, 12:41:56 MD5: 3511B5416EA18DD4AD2D75F133C49E25 SHA1: 817E4DF1F58AA5A584E5D9263F282C1D20533969 CRC32: EB1C1B7B 简述&#xff1a…

丹摩征文活动|FLUX.1+ComfyUI的详细部署以及实验总结

公主请阅 1. FLUX.1的简介2. 部署过程创建资源ComfyUI的部署操作部署FLUX.1 如何使用&#xff1f;实验总结&#xff1a;环境搭建与工具安装实验步骤实验结果分析总结 1. FLUX.1的简介 FLUX.1 是由黑森林实验室开发的图像生成工具&#xff0c;分为三个版本&#xff1a; FLUX-1-…

【电力系统】永磁同步电机调速系统带有扰动观测器

【电力系统】永磁同步电机调速系统带有扰动观测器( DOB)的最优滑模控制、改进补偿滑模控制、传统滑模、PID控制研究 摘要 本文研究了永磁同步电机&#xff08;PMSM&#xff09;调速系统中的不同控制策略&#xff0c;包括最优滑模控制、改进补偿滑模控制、传统滑模控制以及PID控…

手动实现h5移动端点击全屏按钮横屏展示图片,左右滑动切换,处理页面会随着手指滑动问题

页面提供全屏按钮,全屏展示的容器 <div class"container"><button click"openSwiper">点击全屏查看</button><!-- 大图 --><divclass"full"v-if"showSwiper"touchstart"handleTouchStart"touch…

RHEL 网络配置(Linux网络服务器 09)

0 引入 对于Linux系统的网络管理员来说&#xff0c;掌握Linux服务器的网络配置是至关重要的&#xff0c;同时管理远程主机也是网络管理员必须掌握的。这些是后续网络服务配置的基础。 本文&#xff0c;我们讲解如何使用nmtui命令配置网络参数&#xff0c;以及通过nmtui命令查…

【Qt】Macbook M1下载安装

文章目录 一、下载Xcode命令行工具二、在Cion中配置编译器三、安装Qt四、配置qmake环境五、创建Qt项目 博主已经下载了Clion&#xff0c;所以本文是将qt配置到Clion上 本博客所写的教程有一定的问题&#xff0c;因为我在官网下载后发现有一些所需的包是没有的&#xff0c;不知道…

UE5 样条线组件(未完待续)

按点生成模型 按距离生成 spline mesh 可缩放spline mesh

Linux(CentOS)项目总结(前后端分离)

项目情况&#xff1a; 前端开发&#xff1a;vue3 vite ts VSCode后端开发&#xff1a;JDK17 Spring Boot 3 Mybatis Maven IDEA数据库&#xff1a;MySQL8.4.3 SQLyog代码管理&#xff1a;Git虚拟环境&#xff1a;VMware远程登录&#xff1a;FinalShell服务器操作系统&…

【C++】 C++游戏设计---五子棋小游戏

1. 游戏介绍 一个简单的 C 五子棋小游戏 1.1 游戏规则&#xff1a; 双人轮流输入下入点坐标横竖撇捺先成五子连线者胜同一坐标点不允许重复输入 1.2 初始化与游戏界面 初始化界面 X 输入坐标后 O 输入坐标后 X 先达到胜出条件 2. 源代码 #include <iostream> #i…

A算法详解(go实现)

A*算法详解&#xff08;go实现&#xff09; 推荐一位大佬的文章&#xff0c;建议可以去看看https://hogwartsrico.github.io/2016/03/11/AStarPathFinding/index.html 下面贴出来文章中用于举例的网站&#xff1a; https://anvaka.github.io/ngraph.path.demo/#?graphamste…

丹摩征文活动 | 0基础带你上手经典目标检测模型 Faster-Rcnn

文章目录 &#x1f34b;1 引言&#x1f34b;2 平台优势&#x1f34b;3 丹摩平台服务器配置教程&#x1f34b;4 实操案例&#xff08; Faster-rcnn 项目&#xff09;&#x1f34b;4.1 文件处理&#x1f34b;4.2 环境配置&#x1f34b;4.3 训练模型&#x1f34b;4.4 数据保存并导…

Java poi 模板导出Word 带图片

Java poi 模板导出Word 带图片 重点&#xff01;&#xff01;&#xff01; 官方文档&#xff1a;https://deepoove.com/poi-tl/#_maven 最终效果 模板 其实内容都在官方文档里写的非常明白了 我这里只是抛砖引玉。 Maven依赖 <poi.version>4.1.2</poi.version>…

LabVIEW车辆侧翻预警系统

在工业和实验室环境中&#xff0c;搬运车辆、叉车和特种作业车辆经常在负载和高速转弯过程中发生侧翻事故&#xff0c;导致设备损坏和人员伤害。为提高工作环境的安全性&#xff0c;开发了一种基于LabVIEW的工业车辆侧翻预警系统&#xff0c;能够实时监测车辆状态并发出预警&am…

Unity3D UI 双击和长按

Unity3D 实现 UI 元素双击和长按功能。 UI 双击和长按 上一篇文章实现了拖拽接口&#xff0c;这篇文章来实现 UI 的双击和长按。 双击 创建脚本 UIDoubleClick.cs&#xff0c;创建一个 Image&#xff0c;并把脚本挂载到它身上。 在脚本中&#xff0c;继承 IPointerClickHa…

计算机网络——SDN

分布式控制路由 集中式控制路由

深入浅出rust内存对齐

在 Rust 中&#xff0c;内存对齐是一个重要的概念&#xff0c;它涉及到数据在内存中的存储方式&#xff0c;以及如何优化内存访问的效率。往往一门语言的内存布局以及对齐方式决定了一门语言的性能&#xff0c;因此学会并深入理解rust中内存布局会让我们写出高性能的rust代码&a…

ARM64环境使用docker-compose进行ElasticSearch8集群部署

环境规划 主机IP系统ES版本CPU架构用户名密码192.168.174.18Ubuntu 22.04.4 LTSelasticsearch:8.10.4ARM64elasticllodyi4TMmZD192.168.174.218Ubuntu 22.04.4 LTSelasticsearch:8.10.4ARM64192.168.174.112Ubuntu 22.04.4 LTSelasticsearch:8.10.4ARM64 概念&#xff1a; no…

28.医院管理系统(基于springboot和vue)

目录 1.系统的受众说明 2. 相关技术和开发环境 2.1 相关技术 2.1.1 Java语言 2.1.2 HTML、CSS、JavaScript 2.1.3 Redis 2.1.4 MySQL 2.1.5 SSM框架 2.1.6 Vue.js 2.1.7 SpringBoot 2.2 开发环境 3. 系统分析 3.1 可行性分析 3.1.1 经济可行性 3.1.2 技术…

高性能分布式缓存Redis-高可用部署

一、主从架构搭建 为什么要进行主从架构搭建&#xff0c;一台redis不行吗&#xff1f; ①、持久化后的数据只在一台机器上&#xff0c;因此当硬件发生故障时&#xff0c;比如主板或CPU坏了&#xff0c;这时候无法重启服务器&#xff0c;有什么办法可以保证服务器发生故障时数…

Profinet转CanOpen网关连接与CanOpen协议磁轨道实现高效连接

该项目旨在展示如何通过开疆智能Profinet转Canopen网关实现西门子1200PLC与磁轨道之间的连接。以下是项目实施的步骤概要&#xff1a;安装必要的GSD文件到西门子组态软件中&#xff0c;确保系统能够识别并使用Profinet转Canopen网关设备。 进行设备配置&#xff0c;包括将PLC和…