C语言链接数据库

news2025/4/20 1:58:30

目录

使用 yum 配置 mysqld 环境

查看 mysqld 服务的版本

创建 mysql 句柄 

链接数据库 

使用数据库 

增加数据 

修改数据

 查询数据

 获取查询结果的行数

 获取查询结果的列数 

获取查询结果的列名 

获取查询结果所有数据

断开链接 

C语言访问mysql数据库整体源码


        通过前段时间的 mysql 数据库的学习,我们知道了 mysql 数据库本质上就是一个网络服务,本期的主要内容在于讲解如何使用 C 语言相关的接口连接 mysqld 网络服务。

使用 yum 配置 mysqld 环境

        centos7 版本的操作系统使用一下指令安装 mysqld 服务的配置文件。

sudo yum install mysql-devel

        配置好之后,mysqld 相关的头文件在 /usr/include/mysql 目录下。我们连接 mysqld 服务时主要使用 mysql.h 头文件。

        配置好后。mysqld 对应的库文件在 /usr/lib64/mysql 下。

        在链接 mysqlclient 库时,需要使用 -L 字段指明库的路径。 

g++ -o $@ $^ -std=c++11  -L/usr/lib64/mysql -lmysqlclient

查看 mysqld 服务的版本

  • 使用 mysql_get_client_info() 函数查看 mysqld 云服务版本。 
  std::cout<<"client version: "<<mysql_get_client_info()<<std::endl;

        作者的版本是 mysql 5.7.44 版本。

创建 mysql 句柄 

  • 使用 mysql_init() 函数创建 mysql 句柄。
  MYSQL *my=mysql_init(nullptr);

链接数据库 

  • 使用 mysql_real_connect() 函数链接数据库。
#include<iostream>
#include<cstdio>
#include<mysql/mysql.h>

const std::string host="127.0.0.1";
const std::string user="jd";
const std::string password="YJD010918madeinchina...";
const std::string db="study";
const unsigned int port=8088;


int main()
{
    std::cout<<"client version: "<<mysql_get_client_info()<<std::endl;
    
    //1.创建mysql句柄
    MYSQL *my=mysql_init(nullptr);
    //2.链接数据库
    if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0)==nullptr)
    {
        std::cout<<"connect failed!"<<std::endl;
        return 1;
    }
    std::cout<<"connect success!"<<std::endl;
}

        第一个参数为刚开始创建的 mysql 句柄,第二个参数为要访问的 mysqld 的 ip,第三个参数为使用哪个 mysql 用户访问数据库, 第四个参数为访问数据库的这个 mysql 用户的密码是多少,第四个参数为当前用户访问的数据库的名称,第五个参数为访问的 mysqld 的端口号,后面两个参数不需要了解。返回值为 MYSQL* 数据库句柄类型,如果为空则连接数据库失败,如果不为空则链接数据库成功。

使用数据库 

        数据库的使用其实就是对数据库表的使用,数据库表的使用包含四个部分数据记录的 增加,查询,修改,删除

        无论是 增加,查询,修改还是删除,都使用下面的函数进行操作。

 int mysql_query(MYSQL *mysql, const char *q);

        在对数据进行操作之前,我们应该先设置 mysql 句柄的编码格式。

 //设置句柄的编码格式
    mysql_set_character_set(my,"utf8");

增加数据 

        向 study 数据库中的 students 表中插入数据。

insert into students values (6,66,'张三','297599');

        成功插入。 

修改数据

        向 study 数据库中的 students 表中修改数据。 

update from students set name='李四' where id =6;

        成功修改。 

 查询数据

        查询数据是数据操作中较为复杂的一个操作,因为涉及到了将数据查询出来,并将数据显示出来。查询出来数据很简单,但是复杂的是将查询出来的数据显示出来,如何显示出来,我们需要使用 多个接口共同搭配使用将插叙出来的数据显示出来。

        查询 students 表中的所有记录。

select * from students;

        使用下述函数读取  mysql_query()  接口执行之后,mysql 句柄中查询的结果。

MYSQL_RES *mysql_store_result(MYSQL *mysql);
     MYSQL_RES* res=mysql_store_result(my);

        读取的结果存储在了 MYSQL_RES* 类型的返回值指向的特定结构体中。后续使用这个返回值获取相关的结果字段。

 获取查询结果的行数

        使用以下函数查询行数。

 my_ulonglong mysql_num_rows(MYSQL_RES *res);
    //4.2获取查询的行数
    unsigned int rows = mysql_num_rows(res);
    std::cout << rows << std::endl;

        查询列数成功。 

 获取查询结果的列数 

        使用以下函数查询列数。

 unsigned int mysql_num_fields(MYSQL_RES *res);
    unsigned int fields = mysql_num_fields(res);
    std::cout << fields << std::endl;

        查询列数成功。

获取查询结果的列名 

        使用以下函数查询列名。

 MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res); 
//4.3获取查询记录的每一列的列名称
    MYSQL_FIELD* fields_name=mysql_fetch_field(res);
    for(int i=0;i<fields;i++)
    {
        std::cout<<fields_name[i].name<<"\t";
    }
    std::cout<<std::endl;

        查询结果的列名称获取成功。

获取查询结果所有数据

        1.先使用以下函数获取查询结果的所有行数据。

 MYSQL_ROW mysql_fetch_row(MYSQL_RES *result); 

        可以将 MYSQL_ROW 看做一个二维数组。

for(int i=0;i<rows;i++)
    {
         MYSQL_ROW lines=mysql_fetch_row(res);
        //line[i]表示第几行的数据,直接获取是无法获取的,因为无法知道这一行数据的列数
        //就相当于如果只知道二维数组的行标不知道列表也是无法访问二维数组的元素的
    
    }

        2.通过列数,然后再访问每行的每个元素,最终实现所有查询结果的访问。但是要注意,每列的元素都不应为空,否则会出现一些异常打印的问题。

        基于此,对 students 中为空的字段进行修改。

 std::cout << std::endl;
    for (int i = 0; i < rows; i++)
    {
        MYSQL_ROW lines = mysql_fetch_row(res);
        // line[i]表示第几行的数据,直接获取是无法获取的,因为无法知道这一行数据的列数
        // 就相当于如果只知道二维数组的行标不知道列表也是无法访问二维数组的元素的
        for (int j = 0; j < fields; j++)
        {
            std::cout << lines[j] << "\t";
        }
        std::cout << std::endl;
    }

        查询结果的所有数据获取成功。 

断开链接 

        使用以下函数断开链接。

 void mysql_close(MYSQL *sock);
    free(res);
    mysql_close(my);

C语言访问mysql数据库整体源码

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

const std::string host = "127.0.0.1";
const std::string user = "jd";
const std::string password = "YJD010918madeinchina...";
const std::string db = "study";
const unsigned int port = 8088;

int main()
{
    std::cout << "client version: " << mysql_get_client_info() << std::endl;

    // 1.创建mysql句柄
    MYSQL *my = mysql_init(nullptr);
    // 2.链接数据库
    if (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cout << "connect failed!" << std::endl;
        return 1;
    }
    // 3.设置链接的编码格式
    mysql_set_character_set(my, "utf8");
    std::cout << "connect success!" << std::endl;
    // 4.进行数据库表操作
    std::string sql = "select * from students";
    int code = mysql_query(my, sql.c_str());
    if (code != 0)
    {
        std::cout << "execute: " << sql << "failed!" << std::endl;
        return 2;
    }
    std::cout << "execute: " << sql << " success!" << std::endl;
    // 4.1获取查询的结果到res中
    MYSQL_RES *res = mysql_store_result(my);
    // 4.2获取查询的行数
    int rows = mysql_num_rows(res);
    std::cout << rows << std::endl;
    int fields = mysql_num_fields(res);
    std::cout << fields << std::endl;
    // 4.3获取查询记录的每一列的列名称
    MYSQL_FIELD *fields_name = mysql_fetch_field(res);
    for (int i = 0; i < fields; i++)
    {
        std::cout << fields_name[i].name << "\t";
    }
    // 4.4获取查询结果的每一行的数据
    std::cout << std::endl;
    for (int i = 0; i < rows; i++)
    {
        MYSQL_ROW lines = mysql_fetch_row(res);
        // line[i]表示第几行的数据,直接获取是无法获取的,因为无法知道这一行数据的列数
        // 就相当于如果只知道二维数组的行标不知道列表也是无法访问二维数组的元素的
        for (int j = 0; j < fields; j++)
        {
            std::cout << lines[j] << "\t";
        }
        std::cout << std::endl;
    }
    //5.断开链接
    mysql_close(my);
}

        至此,C语言链接数据库的操作全部完成。

        本期内容到此结束^_^

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

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

相关文章

中间件--ClickHouse-9--MPP架构(分布式计算架构)

1、MPP 架构基础概念 MPP(Massively Parallel Processing 大规模并行处理) 是一种分布式计算架构&#xff0c;专门设计用来高效处理大规模数据集。在这种架构下*&#xff0c;数据库被分割成多个部分&#xff0c;每个部分可以在不同的服务器节点上并行处理*。这意味着&#xff…

分布式计算领域的前沿工具:Ray、Kubeflow与Spark的对比与协同

在当今机器学习和大数据领域&#xff0c;分布式计算已成为解决大规模计算问题的关键技术。本文将深入探讨三种主流分布式计算框架——Ray、Kubeflow和Spark&#xff0c;分析它们各自的特点、应用场景以及如何结合它们的优势创建更强大的计算平台。 Spark批量清洗快&#xff0c;…

每天学一个 Linux 命令(20):find

​​可访问网站查看,视觉品味拉满: http://www.616vip.cn/20/index.html find 是 Linux 系统中最强大的文件搜索工具之一,支持按名称、类型、时间、大小、权限等多种条件查找文件,并支持对搜索结果执行操作(如删除、复制、执行命令等)。掌握 find 可大幅提升文件管理效率…

Winform发展历程

Windows Forms (WinForms) 发展历程 起源与背景&#xff08;1998-2002&#xff09; Windows Forms&#xff08;简称WinForms&#xff09;是微软公司推出的基于.NET Framework的GUI&#xff08;图形用户界面&#xff09;开发框架&#xff0c;于2002年随着.NET Framework 1.0的…

npx 的作用以及延伸知识(.bin目录,npm run xx 执行)

文章目录 前言原理解析1. npx 的作用2. 为什么会有 node_modules/.bin/lerna3. npx 的查找顺序4. 执行流程总结1&#xff1a; 1. .bin 机制什么是 node_modules/.bin&#xff1f;例子 2. npx 的底层实现npx 是如何工作的&#xff1f;为什么推荐用 npx&#xff1f;npx 的特殊能力…

本地部署DeepSeek-R1(Dify升级最新版本、新增插件功能、过滤推理思考过程)

下载最新版本Dify Dify1.0版本之前不支持插件功能&#xff0c;先升级DIfy 下载最新版本&#xff0c;目前1.0.1 Git地址&#xff1a;https://github.com/langgenius/dify/releases/tag/1.0.1 我这里下载到老版本同一个目录并解压 拷贝老数据 需先停用老版本Dify PS D:\D…

【ubuntu】在Linux Yocto的基础上去适配Ubuntu的wifi模块

一、修改wifi的节点名 1.找到wifi模块的PID和VID ifconfig查看wifi模块网络节点的名字&#xff0c;发现是wlx44876393bb3a&#xff08;wlxmac地址&#xff09; 通过udevadm info -a /sys/class/net/wlx44876393bba路径的命令去查看wlx44876393bba的总线号&#xff0c;端口号…

25软考新版系统分析师怎么备考?重点考哪些?(附新版备考资源)

软考系统分析师&#xff08;高级资格&#xff09;考试涉及知识面广、难度较大&#xff0c;需要系统化的复习策略。以下是结合考试大纲和历年真题整理的复习重点及方法&#xff1a; 一、明确考试结构与分值分布 1.综合知识&#xff08;选择题&#xff0c;75分&#xff09; 2…

PyTorch入门------卷积神经网络

前言 参考&#xff1a;神经网络 — PyTorch Tutorials 2.6.0cu124 文档 - PyTorch 深度学习库 一个典型的神经网络训练过程如下&#xff1a; 定义一个包含可学习参数&#xff08;或权重&#xff09;的神经网络 遍历输入数据集 将输入通过神经网络处理 计算损失&#xff08;即…

Edge浏览器安卓版流畅度与广告拦截功能评测【不卡还净】

安卓设备上使用浏览器的体验&#xff0c;很大程度取决于两个方面。一个是滑动和页面切换时的反应速度&#xff0c;另一个是广告干扰的多少。Edge浏览器的安卓版本在这两方面的表现比较稳定&#xff0c;适合日常使用和内容浏览。 先看流畅度。Edge在中端和高端机型上启动速度快&…

Docker 和 Docker Compose 使用指南

Docker 和 Docker Compose 使用指南 一、Docker 核心概念 镜像&#xff08;Image&#xff09; &#xff1a;应用的静态模板&#xff08;如 nginx:latest​&#xff09;。容器&#xff08;Container&#xff09; &#xff1a;镜像的运行实例。仓库&#xff08;Registry&#xf…

vue3环境搭建、nodejs22.x安装、yarn 1全局安装、npm切换yarn 1、yarn 1 切换npm

vue3环境搭建 node.js 安装 验证nodejs是否安装成功 # 检测node.js 是否安装成功----cmd命令提示符中执行 node -v npm -v 设置全局安装包保存路径、全局装包缓存路径 在node.js 安装路径下 创建 node_global 和 node_cache # 设置npm全局安装包保存路径&#xff08;新版本…

Python人工智能 使用可视图方法转换时间序列为复杂网络

基于可视图方法的时间序列复杂网络转换实践 引言 在人工智能与数据科学领域&#xff0c;时间序列分析是一项基础且重要的技术。本文将介绍一种创新的时间序列分析方法——可视图方法&#xff0c;该方法能将时间序列转换为复杂网络&#xff0c;从而利用复杂网络理论进行更深入…

spring:加载配置类

在前面的学习中&#xff0c;通过读取xml文件将类加载&#xff0c;或他通过xml扫描包&#xff0c;将包中的类加载。无论如何都需要通过读取xml才能够进行后续操作。 在此创建配置类。通过对配置类的读取替代xml的功能。 配置类就是Java类&#xff0c;有以下内容需要执行&#…

从零搭建一套前端开发环境

一、基础环境搭建 1.NVM(Node Version Manager)安装 简介 nvm&#xff08;Node Version Manager&#xff09; 是一个用于管理多个 Node.js 版本的工具&#xff0c;允许开发者在同一台机器上轻松安装、切换和使用不同版本的 Node.js。它特别适合需要同时维护多个项目&#xff…

金融数据库转型实战读后感

荣幸收到老友太保科技有限公司数智研究院首席专家林春的签名赠书。 这是国内第一本关于OceanBase数据库实际替换过程总结的的实战书。打个比方可以说是从战场上下来分享战斗经验。读后感受颇深。我在这里讲讲我的感受。 第三章中提到的应用改造如何降本。应用改造是国产化替换…

代码审计系列2:小众cms oldcms

目录 sql注入 1. admin/admin.php Login_check 2. admin/application/label/index.php 3. admin/application/hr/index.php 4. admin/application/feedback/index.php 5. admin/application/article/index.php​ sql注入 1. admin/admin.php Login_check 先看一下p…

Cursor + MCP,实现自然语言操作 GitLab 仓库

本分分享如何使用 cursor mcp 来操作极狐GitLab 仓库&#xff0c;体验用自然语言在不接触极狐GitLab 的情况下来完成一些仓库操作。 极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitL…

Vue el-from的el-form-item v-for循环表单如何校验rules(一)

实际业务需求场景&#xff1a; 新增或编辑页面&#xff08;基础信息表单&#xff0c;一个数据列表的表单&#xff09;&#xff0c;数据列表里面的表单数是动态添加的。数据可新增、可删除&#xff0c;在表单保存前&#xff0c;常常需要做表单必填项的校验&#xff0c;校验通过以…

【Reading Notes】(8.3)Favorite Articles from 2025 March

【March】 雷军一度登顶中国首富&#xff0c;太厉害了&#xff08;2025年03月02日&#xff09; 早盘&#xff0c;小米港股一路高歌猛进&#xff0c;暴涨4%&#xff0c;股价直接飙到52港元的历史新高。这一波猛如虎的操作&#xff0c;直接把雷军的身家拉到了2980亿元&#xff0c…