Linux程序设计 学习笔记 第八章 MySQL(部分)

2023-11-06

用C语言连接MySQL包含两个步骤:
1.初始化一个连接句柄结构。
2.实际进行连接。

初始化连接句柄:
在这里插入图片描述
通常传递NULL给此例程,它返回一个指向新分配的连接句柄结构的指针。如果传递一个已有的结构,它将被重新初始化。mysql_init函数出错时返回NULL。

分配和初始化一个句柄后,需要调用mysql_real_connect向一个连接提供参数:

MYSQL *mysql_real_connect(MYSQL *connection,
    const char *server_host,
    const char *sql_user_name,
    const char *sql_password,
    const char *db_name,
    unsigned int port_number,
    const char *unix_socket_name,
    unsigned int flags);

参数connection必须指向被mysql_init函数初始化过的结构。

参数server_host既可以是主机名,也可以是IP地址,如果是连接到本地机器,可通过指定localhost或NULL(两者含义相同)来优化连接类型,优化后,将使用套接字(UNIX)或命名管道(Windows)而非TCP/IP连接到数据库。

如果数据库登录名参数sql_user_name为NULL,则假设登录名为当前Linux用户的登录ID;如果数据库密码参数sql_password为NULL,那么只能访问服务器上无需密码就能访问的内容。

MySQL端口号port_name和unix_socket_name参数应该分别为0和NULL,除非改变了MySQL的默认设置,它们将默认使用合适的值。参数unix_socket_name指定使用的套接字或命名管道。

flags参数改变使用协议的某些特性。

使用完连接后,通常在程序退出时,要调用:
在这里插入图片描述
如果参数connection是由mysql_init函数建立的,MySQL结构会被释放,指针将会失效并无法再次使用。保留一个不需要的连接是对资源的浪费,而重新打开连接会带来额外开销,要权衡何时使用mysql_close函数。

MySQL错误处理函数使用一系列由连接句柄结构报告的返回码:
在这里插入图片描述
在这里插入图片描述
可调用mysql_errno并传递连接句柄结构来获得错误码,它通常是非0值,如没有设定错误码,则返回0,每次调用库函数(除了以上两个错误检查例程)都会更新错误码,因此只能得到最后一个执行命令的错误码。

错误码定义在头文件errmsg.h或mysqld_error.h中,前者报告客户端错误,后者关注服务器端错误。

mysql_error函数返回文本错误信息,这些信息被写入内部静态内存空间中,因此如果想保存错误文本,需要把它复制到别的地方。

执行sql语句的API:
在这里插入图片描述
参数query是不带分号的有效sql语句文本串。成功时,函数返回0。对于包含二进制数据的查询,可使用mysql_real_query函数。

对于不返回任何数据的sql语句,如update、delete、insert,检查受sql影响的行数:
在这里插入图片描述
此函数的返回类型在printf时,推荐使用%ul格式将其转换成无符号长整型。这个函数返回受之前没有返回值的sql语句影响的行数。MySQL返回的是一个被更新操作修改的行数,但其他许多数据库仅因为某行记录匹配where字句就把它视为已更新过。

在C应用程序中提取数据库数据分以下步骤:
1.执行查询。
2.提取数据。
3.处理数据。
4.必要的清理工作。

先用mysql_query函数发送sql语句,之后可以使用mysql_use_result(一次返回一行数据)或mysql_store_result(一次返回所有结果)函数来提取数据,结果集比较小时,后者比较合适。

在这里插入图片描述
此函数将返回所有查询到的数据,它返回一个指向结果集结构的指针,如果执行失败,则返回NULL。

mysql_store_result成功调用后,需要调用mysql_num_rows来得到返回记录的数目,一般是一个正数,如果没有返回行,mysql_num_rows函数将返回0。

在这里插入图片描述
如果mysql_store_result调用成功,则mysql_num_rows函数始终返回成功。

如果查询结果是一个特别庞大的数据集,最好提取小一些、更易管理的信息块,这样可以更快地将控制权返回给应用程序,且不会占用大量网络资源。

现在,可以调用mysql_fetch_row处理MYSQL_RES结果结构,从中提取一行,并把该行放到一个行结构中,当数据用完或发生错误时,返回NULL:
在这里插入图片描述
也可用mysql_data_seek函数在结果集中进行跳转,从而设置被下一个mysql_fetch_row函数返回的行:
在这里插入图片描述
参数offset的值是一个行号,它必须在0到结果集总行数-1的范围内,传递0会导致下一个mysql_fetch_row调用返回结果集中的第一行。

完成了对数据的所有操作后,必须使用mysql_free_result函数让MySQL库完成善后处理:
在这里插入图片描述
必须总是调用此函数让MySQL库清理它分配的对象。

逐行提取数据:
在这里插入图片描述
执行失败时返回NULL,如果成功,返回指向结果集对象的指针。用mysql_use_result函数返回的MYSQL_RES结构来调用msyql_fetch_row时,每次都从服务器取回行数据。

为得到所有数据,必须再反复调用mysql_fetch_row直到取得了所有数据(即直到mysql_fetch_row函数返回NULL),如果没有取完所有数据,则下次执行返回数据的sql语句时可能会返回遭到破坏的信息。

mysql_use_result调用不能与mysql_data_seek、mysql_row_seek、mysql_row_tell一起使用,并且由于直到所有数据都被提取后才能实际生效,因此mysql_num_rows的使用也受到限制。每个行请求和结果的返回都要通过网络,可能网络连接在中途失败,留下不完整的数据。但mysql_use_result函数更好地平衡了网络负载,减少了可能非常大的数据集带来的存储开销。

MySQL返回两种类型数据:元数据和表中的列数据。

mysql_field_count函数返回结果集中字段(列)的个数:
在这里插入图片描述
在旧版本的MySQL代码中,mysql_num_fields函数可以接受一个连接结构或结果结构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux程序设计 学习笔记 第八章 MySQL(部分) 的相关文章

随机推荐

  • 如何快速开通微信小程序 流量主

    1 开通微信小程序分享盆友圈功能 2 转发给自己的盆友 3 找一些相关的群转发 4 建立自己的互刷群 有意的可以添加微信 相互刷 5 下面的我的小程序demo 欢迎大家看一看
  • dgl学习笔记05-在GPU上使用DGL图

    这个很简单 跟使用pytorch的GPU计算是一样的 就不解释了 直接上代码 代码 import dgl import torch device if torch cuda is available device cuda 0 else d
  • 常见测温传感器及电路原理图

    温度这个物理量在很多场合需要检测 目前市场测温的方法和种类也比较多 在选用何种方法的时候 需要被考虑到的因素有 温度检测范围 精度 灵敏度 应用场合 封装形式 成本等等 根据自己最近研究的内容 将温度检测的方式也可以叫电路分为模拟式和数字式
  • Linux登录mysql时 密码正确登录不进去,没有密码却能登进去

    今天上午遇到的问题 mysql密码正确登录不进去 没有密码却能登进去 解决方法 使用Navicat连接上该root权限的数据库 进入mysql 库的user 表 将 root用户的Host 127 0 0 1或者 local 改为local
  • IDEA tomcat8.5 控制台打印中文内容乱码

    运行SpringMVC项目时发现后台获取到的中文数据输出在控制台上是乱码 已经设置了字符编码过滤器 解决 方法1 修改D apache tomcat 8 5 70 bin目录下catlina bat文件 追加 Dfile encoding
  • 【C语言】字符串排序

    文章目录 前言 一 需要的相关知识 二 代码实现 1 指针数组指向的字符串常量 2 使用二维数组存放字符串 前言 在理解二维数组和数组指针的结合使用 指针数组相关内容后 会更易于理解 一 需要的相关知识 指针数组存放常量字符串和二维数组结构
  • echarts字变大_在echarts中如何调整lable的字体大小?

    series i pie data i label normal textStyle fontSize 透過設定 fontSize 就可以調整大小了 你可以參考 官網的範例 手動修改左側欄 label 的 fontSize 看看 是可以調整
  • TLS中PSK的简要介绍

    PSK的目的 我们都知道TLS需要依赖非对称算法 RSK EC DS DH 完成秘钥交换 身份认证的功能 但是非对称算法的耗时和耗计算资源的特性在对资源或者耗时敏感的场景下 你就想把他优化掉 本文我们就简绍一种TLS标准本身提供的优化方式
  • C++11新特性——时间操作chrono库

    此课件及源代码来自B站up主 码农论坛 该文章仅作为本人学习笔记使用 C 11提供了chrono模版库 实现了一系列时间相关的操作 时间长度 系统时间和计时器 头文件 include
  • Python从入门到放弃

    第一篇 markdown编辑器 001 markdown基本语法 第二篇 计算机基础 002 计算机基础之编程 003 计算机组成原理 004 计算机操作系统 005 编程语言分类 006 网络的瓶颈效应 007 计算机基础小结 第三篇 P
  • go语言日志收集系统

    0 项目地址 完整项目的GitHub地址 https github com taw19960426 learning go language tree main go log collect 一 日志收集系统背景 1 项目背景 a 每个系统
  • 如何在CentOS上安装Java

    Java是一种免费的开放源代码 并且是专门设计用于Internet的分布式环境的最流行的编程语言之一 Java有两种不同的实现 Oracle Java和OpenJDK Oracle Java具有一些其他商业功能 而OpenJDK是Java平
  • spring boot常见注解

    目录 1 EasyPoi基础功能常见的五个注解 2 Component 3 在mybatis映射接口的配置中 resultType和parameterType的用法 4 EqualsAndHashCode callSuper false 5
  • stm32定时器实现60秒定时秒表

    include led h include delay h include key h include sys h include lcd h include usart h include timer h include beep h e
  • games101,lecture11(obj文件)

    OBJ 这里的obj是一个文本文件 和编译生成的obj文件是不一样的 更多详解 https blog csdn net shenshen211 article details 51740988 添加链接描述 https www jiansh
  • MySql,SQLServer,SQLite性能比较

    工作任务 测试三个数据库的性能 测试方法 C 编写工具 对数据库进行大量数据Insert和Selectc测试 测试结果 Insert测试 Select测试 测试结果 SQLServer 和 MySql性能相差不大 Sqlite则数据多大几万
  • Java中局部变量、静态变量、静态方法的有效范围与调用

    1 局部变量 定义 在成员方法中定义的变量称为局部变量 方法中的形参也可以作为局部变量 例 public void method1 n i均为局部变量 int n for int i 0 i lt 5 i System out printl
  • C++获取其他程序内信息

    1 根据程序名称获取程序窗口句柄 一个程序获取另一个程序Edit控件的内容 char temp 256 strTest clear 根据指定程序的标题名获取改程序窗口的句柄 HWND hWnd FindWindow NULL L Test
  • v-if和v-show的区别

    v if是动态的向DOM树内添加或者删除DOM元素 v show是通过设置DOM元素的dispaly样式的显示或隐藏 编译过程 v if切换有一个局部编译 卸载的过程 切换过程中合适的销毁和重建内部的事件监听和子组件 v show只是简单的
  • Linux程序设计 学习笔记 第八章 MySQL(部分)

    用C语言连接MySQL包含两个步骤 1 初始化一个连接句柄结构 2 实际进行连接 初始化连接句柄 通常传递NULL给此例程 它返回一个指向新分配的连接句柄结构的指针 如果传递一个已有的结构 它将被重新初始化 mysql init函数出错时返