mysql 客户端简单搭建

news2025/1/18 8:56:15

主要使用的是mysql开发包中的api接口

操作流程

1.初始化mysql操作句柄

    MYSQL *mysql_init(MYSQL *mysql);

        对传人的句柄进行初始化

        若传入的句柄为NULL,则内部会动态申请空间,进行初始化,并返回句柄首地址

        返回值:若失败则返回NULL

2.链接mysql服务器

        MYSQL *mysql real connect(MYSQL *mysql, char *host, char *user, char *pass, char *dbname,
        int port, char *unix _socket, int client_flag)
        mysql:初始化完成的mysql句柄;

        host:用户名;

        port:端口,默认0为3306端口,是mysql服务的端口;

        pass: 密码;

        dbname:要操作的库名称

        unix socket:套接字或管道文件名-通常置NULL

        client flag: 客户端的操作标志,通常置0;

        返回值:成功则返回句柄首地址,失败返回NULL

3.设置客户端字符集(通常是与服务器保持一致,使用utf3)
         int mysql_set character_set(MY sQL *mysal, char *name)
         mysql:操作句柄;

         name:宇符集名称,通常是"utf8”

         返回值:成功返回0;失败返回非0;

4.选择要操作的数据库(切换操作的库)
          int mysql_select_db(MYsQL *mysq. char *dbname):

5.将sql语句发送给服务器,并执行sql语句
          int mysql_query(MY SQL *mysql, char *sql);
          mysql:操作句柄;

          sql:对数据库中的数据进行操作的sql语句

          返回值:成功返回0:失败返回非0

          语句有没有执行成功,决定了当前的操作是否完成了

6.增改删操作,只要语句执行成功,就OK,但是如果是查询语向,因为查询的话语向执行成功了,还需要获取查询结果

  1. 将查询结果保存到本地
    MYSQL RES *mysql store result(MYSQL *mysal);                                                                                                      mysq:操作句柄;
  2. 返回值:成功返回结果集的结构首地址,失败返回NULL
    将结果集保存到本地与执行语句这一步操作,若使用的是同一个操作句柄则存任线程安全问题
  3. 获取结果集中的结果行数和列数
    int mysal num rows(MYSQL RES *res); 获取结果有多少行int mysql num fields(MYSQL RES *res);获取一行中有多少列
  4. 遍历结果集,逐条取出数据
    MYSQL_ ROW mysql fetch row(MY SQL_ RES *res);
    注意:这个函数或者说res 内部记录了当前的读写位置,只需要不断的调用,就可以逐条取出数据
    这个返回值是个字符指针数组char *arr0,将一行中的多列进行扁平化存储,每一个元素都是一列数据
  5. 释放结果集
    int mysql_ free_ result(MYSQL_ RES *res);

7. 关闭容户端连接,释放句柄资源

          int mysql close(MYSQL *mysql);

代码展示

#include<mysql/mysql.h>
#include<unistd.h>
#include<string.h>

int main()
{
  //初始化mysql句柄
  MYSQL *mysql = mysql_init(NULL);
  if(mysql == NULL)
  {
    printf("mysql init error !");
    return -1;
  }
  //选择mysql服务器进行链接
  if(mysql_real_connect(mysql,"0.0.0.0","root","","test",0,NULL,0) == NULL)
  {
    printf("connect failed :%s \n",mysql_error(mysql));
    mysql_close(mysql);
  }
  //设置字符集
  int ret;
  ret = mysql_set_character_set(mysql,"utf8");
  if(ret != 0)
  {
    printf("set character failed :%s \n",mysql_error(mysql));
  }
  //选择操作的数据库
  mysql_select_db(mysql,"test");
  //执行语句
  const char* select_sql = "select * from student;";
  ret = mysql_query(mysql,select_sql);
  if(ret != 0)
  {
    printf("query failed :%s \n",mysql_error(mysql));
    mysql_close(mysql);
    return -1;
  }
  //查询语句执行结果
  MYSQL_RES* res = mysql_store_result(mysql);
  if(res == NULL)
  {
    printf("store result  failed :%s \n",mysql_error(mysql));
    mysql_close(mysql);
    return -1;
  }
  int num_row = mysql_num_rows(res);
  int num_col = mysql_num_fields(res);
  for(int i = 0 ; i < num_row;i++)
  {
    MYSQL_ROW row = mysql_fetch_row(res);
    for(int j = 0 ;j < num_col;j++){
      printf("%-15s",row[j]);
    }
    printf("\n");
  }
  mysql_free_result(res);
  mysql_close(mysql);
}

           17f054db872d4d61974c1fcc22019371.png

 

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

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

相关文章

基于51单片机的ds18b20数字华氏温度计

资料编号&#xff1a;114 下面是相关功能视频演示&#xff1a; 114-基于51单片机的数字华氏温度计报警&#xff08;源码仿真全套资料&#xff09;功能讲解&#xff1a; 采用51单片机采集DS18B20的温度&#xff0c;LCD1602显示&#xff0c;并且可以设置上下限值&#xff0c;超…

Unity UI 框架

开源地址&#xff1a; GitHub - NRatel/NRFramework.UI: 基于 Unity UGUI 的 UI 开发框架基于 Unity UGUI 的 UI 开发框架. Contribute to NRatel/NRFramework.UI development by creating an account on GitHub.https://github.com/NRatel/NRFramework.UI 一、需求/功能要点…

headscale的部署方法和使用教程

headscale的部署方法和使用教程1. headscale文件下载2. 上传并赋予文件权限3. 创建以及修改相关配置文件3.1 创建配置目录&#xff1a;3.2 创建目录用来存储数据与证书&#xff1a;3.3 创建空的 SQLite 数据库文件&#xff1a;3.4 创建 Headscale 配置文件&#xff1a;3.5 创建…

Vue 组件间通信并不是每一次操作都会触发新的通信

需求&#xff1a;新增或者修改都需要组件间立马通信。 操作&#xff1a;把B组件(子组件&#xff0c;这里指的是三级联动组件)的数据传输过来&#xff0c;在A(父组件)组件中处理 即 子传父 这里指的是修改页面或者新增页面三级联动下拉选择完之后 点击 提交 会执行A组件的修改操…

开启安全测试评估赛道,永信至诚发布“数字风洞”产品体系

11月19日&#xff0c;永信至诚产品战略发布会上&#xff0c;面向安全测试评估领域的“数字风洞”产品体系战略发布&#xff0c;标志着永信至诚作为网络靶场和人才建设领军企业&#xff0c;再次以“产品乘服务”的价值体系&#xff0c;开启网络安全测试评估专业赛道。 数字化时代…

MySQL安装

本笔记来自B站黑马程序员讲解的MySQL的使用。 目录 ​编辑 一、MySQL的安装 1、数据库基础概念 2、MySQL下载并安装​编辑 三、启动MySQL 四、连接MySQL数据库 1、使用MySQL提供的客户端命令来连接 2、使用Windows 命令打开&#xff1a; 第一步 配置path的环境变量 第…

uniapp入门:常用事件绑定与数据同步

1.常见事件与事件绑定 1.1点击事件bindtap 1.2 文本输入事件bindinput 1.3 切换事件bindtouchend 2.数据同步 2.1事件回调 2.2逻辑层中page对象中的中数据如何进行改变 2.3页面触发事件如何传参到page中数据 …

ASEMI代理艾赛斯二极管DSA300I100NA,肖特基DSA300I100NA

编辑-Z 艾赛斯硅肖特基二极管DSA300I100NA参数&#xff1a; 型号&#xff1a;DSA300I100NA 最大重复反向阻断电压&#xff08;VRRM&#xff09;&#xff1a;100V 反向电流、漏极电流&#xff08;IR&#xff09;&#xff1a;3mA 正向电压降&#xff08;VF&#xff09;&…

STM32CubeMX外部中断

建议提前学习&#xff1a;使用STM32CubeMX实现按下按键&#xff0c;电平反转&#xff1b; 目录 EXTI 中断 中断的概念 抢占优先级与响应优先级 中断分组 事件 上升沿&#xff0c;下降沿以及双边沿触发 上升沿&#xff0c;下降沿以及双边沿的概念 上升沿&#xff0c;下…

数据结构-双链表思路解析及代码实现

双链表是单链表的进阶版&#xff0c;单链表是1-2-3-4 一个个排排坐链接&#xff0c;只管向后拉手&#xff0c;其主要思想是当前节点与下一节点的关系&#xff0c;那么双链表就多了一层关系&#xff0c;当前节点不仅和一下一点连起来&#xff0c;也要和上一节点串联起来。与前与…

【全志T113-S3_100ask】13-1 Linux c语言ioctl驱动oled(iic、ssd1306)屏幕

【全志T113-S3_100ask】13-1 Linux C通过ioctl驱动oled[ssd1306]屏幕 背景&#xff08;一&#xff09;i2c关键结构体1、i2c_rdwr_ioctl_data结构体2、struct i2c_msg结构体&#xff08;二&#xff09;i2c关键代码1、写函数2、读函数&#xff08;三&#xff09;对oled的操作&…

深度学习和神经网络的介绍(一)

1、深度学习和神经网络 1.1 深度学习的介绍 目标&#xff1a; 知道什么是深度学习知道深度学习和机器学习的区别能够说出深度学习的主要应用场景知道深度学习的常见框架 1.1.1 深度学习的概念 深度学习是机器学习的分支&#xff0c;是一种以人工神经网络为架构&#xff0c…

计算机网络4小时速成:计算机网络基础,计网组成,计网分类,性能指标,标准化组织,计网结构模型,五层模型

计算机网络4小时速成&#xff1a;计算机网络基础&#xff0c;计网组成&#xff0c;计网分类&#xff0c;性能指标&#xff0c;标准化组织&#xff0c;计网结构模型&#xff0c;五层模型 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&…

05_TCP并发服务器

知识点1【TCP并发服务器】 1、多线程&#xff08;常用&#xff09; 2、解决上述问题&#xff1a;端口复用 仅仅是端口的复用 3、并发服务器 多进程实现 总结&#xff1a; 知识点2【HTTP协议】 HTTP基于TCP 1、HTTP协议的概述 2、Webserver 通信过程 3、Web编程开发 知识…

Cadence orcad 批量设置原理图标题栏

前言 作为一份规范的原理图文件&#xff0c;必须要有Title Block&#xff0c;一般是在右下角的原理图信息&#xff0c;包括标题&#xff0c;图纸尺寸&#xff0c;设计师&#xff0c;时间&#xff0c;页码等等。 这里需要两个操作&#xff1a; 一、批量修改Title Block的信息 …

Go语言进阶篇,单元测试、基准测试的性能测试、内存占用测试

在go语言中的单元测试比较有意思&#xff0c;比如测试一个函数是很方便的&#xff0c;只需要将文件名修改为_test.go这样的后缀即可&#xff0c;我们新建一个目录xxx&#xff0c;然后新建xxx_test.go文件&#xff0c;当然这个xxx的名字你可以按照功能来命名&#xff0c;如下&am…

Java开发:多线程编程

本章篇幅主要记录多线程编程相关的知识&#xff0c;如有纰漏&#xff0c;望指出。 话不多说&#xff0c;正式开启多线程之旅... 目录 一、多线程使用方式 A、Thread B、Runnable&#xff08;推荐&#xff09; C、Callable 二、线程的五个状态 三、线程停止 四、线程休…

LabVIEW性能和内存管理 7 LabVIEW中局部和全局变量的内存分配

LabVIEW性能和内存管理 7 LabVIEW中局部和全局变量的内存分配 本文介绍LabVIEW性能和内存管理的几个建议7。 LabVIEW Cleanup – LabVIEW cleans upmany references when the owning VI goes idle and others when the process closes – Manually closereferences t…

Bean的作用域和生命周期

1. Bean 的作用域 对于全局变量,局部变量等的作用域相信大家都已经很清楚了,但是对于对象作用域有点摸不着头脑,下面通过一个简单的案例,康康对象的作用域 1.1 案例引入 现有一个公共的 Bean 对象 package com.bean.model;import org.springframework.stereotype.Componen…

【IEEE2017】RL:机器人库:一种面向对象的机器人应用程序的方法

RL&#xff1a;机器人库&#xff1a;一种面向对象的机器人应用程序的方法 摘要&#xff1a; 摘要&#xff1a;我们讨论了机器人库&#xff08;RL&#xff09;的架构和软件工程原理。在机器人系统、研究项目、工业应用和教育的需求的驱动下&#xff0c;我们确定了相关的设计需求…