MFC+MySQL应用操作(MySQL C API )

MFC+MySQL应用操作

  • 1. MySQL C API 相关接口
    • 1.1 基本数据结构
      • MYSQL结构体的应用
    • 1.2 常用函数
  • 2. 连接数据库
  • 3. 读取数据库行数据

1. MySQL C API 相关接口

1.1 基本数据结构

  1. MYSQL是一个重要的数据结构,它代表了与MySQL服务器的连接。当你使用MySQL的C API来与MySQL服务器进行交互时,你需要首先创建一个MYSQL对象,并使用它来建立、管理和终止与MySQL服务器的连接。
    MYSQL结构体包含了许多字段,这些字段用于保存连接信息、配置参数以及其他与连接相关的状态。然而,在实际编程中,你通常不需要直接访问或修改MYSQL结构体的内部字段,而是使用提供的函数来设置连接参数、建立连接、执行查询等。
  2. MYSQL_RES 是 MySQL C API 中定义的一个结构体,用于表示从 MySQL 服务器检索到的结果集。
  3. MYSQL_ROW是一个用于表示结果集中一行的数据类型。当你在MySQL数据库中执行一个SELECT查询并获取结果集后,你可以遍历这个结果集,每次迭代处理一行数据。每一行数据都被表示为一个MYSQL_ROW类型的变量,它实际上是一个指向字符串数组的指针,其中每个字符串都是该行中某一列的值。
  4. MYSQL_FIELD是一个结构体,用于描述结果集中的列(或称为字段)的元数据。当你执行一个查询并获取结果集时,你可以使用MYSQL_FIELD结构体来获取关于结果集中每一列的信息,如列名、数据类型、最大长度等。MYSQL_FIELD结构体通常与mysql_fetch_field()或mysql_fetch_fields()函数一起使用。这些函数允许你遍历结果集中的列,并获取每个列的MYSQL_FIELD结构体。

MYSQL结构体的应用

  1. 初始化:使用mysql_init()函数来初始化一个MYSQL对象。这通常是在创建新连接之前的第一步。
MYSQL *mysql = mysql_init(NULL);
if (mysql == NULL) {// 错误处理
}
  1. 设置连接参数
    使用mysql_real_connect()函数来设置连接参数并尝试建立连接。这个函数需要一个MYSQL对象作为参数,并接受其他参数来指定主机名、用户名、密码等。
if (!mysql_real_connect(mysql, "host", "user", "password", "database", 0, NULL, 0)) {// 错误处理
}
  1. 执行查询
    使用mysql_query()函数来执行SQL查询或命令。这个函数同样需要一个MYSQL对象作为参数。
if (mysql_query(mysql, "SELECT * FROM table")) {// 错误处理
}
  1. 获取结果集
    如果查询返回了结果集(例如SELECT查询),你可以使用mysql_store_result()或mysql_use_result()函数来获取结果集,并使用MYSQL_RES和MYSQL_ROW等结构来遍历和处理结果。
  2. 关闭连接
    使用mysql_close()函数来关闭与MySQL服务器的连接。在调用这个函数之后,你应该避免再次使用该MYSQL对象。
mysql_close(mysql);

1.2 常用函数

MySQL C API 提供了一组函数,用于与 MySQL 数据库进行交互。以下是一些常用的基本函数接口:
初始化与连接

  1. mysql_init()
    初始化一个 MYSQL 结构体实例。
  2. mysql_real_connect()
    连接到 MySQL 服务器。

查询

  1. mysql_query() (过时的,一般用下面的函数)
    发送一个 SQL 查询或命令到 MySQL 服务器。
  2. int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length);
    参数说明:
    mysql:一个指向 MYSQL 结构的指针,该结构包含了与 MySQL 服务器的连接信息。
    query:一个指向 SQL 查询字符串的指针。
    length:查询字符串的长度。如果查询字符串是以 null 结尾的,你也可以使用 strlen(query) 来获取长度,但是 mysql_real_query 允许你传递二进制数据或包含 null 字符的字符串,此时你需要明确指定 length。
    函数返回值:
    如果成功,mysql_real_query 返回 0。
    如果失败,返回非零值。你可以使用 mysql_error(mysql) 函数来获取具体的错误信息。
  3. mysql_store_result()
    对于 SELECT 语句,获取完整的结果集到一个 MYSQL_RES 结构中。
  4. mysql_use_result()
    对于 SELECT 语句,获取一个指向结果集的指针,结果集将在你获取行时从服务器中检索。
  5. mysql_fetch_row()
    从结果集中获取一行数据。
  6. mysql_num_rows()
    获取结果集中的行数(对于使用 mysql_store_result() 的结果集)。
  7. mysql_num_fields()
    获取结果集中的列数。
  8. mysql_fetch_field()
    获取结果集中当前行的字段信息。
  9. mysql_fetch_field_direct()
    根据列索引获取字段信息。

错误处理

  1. mysql_error()
    返回最近一次调用 API 函数的错误描述。
  2. mysql_errno()
    返回最近一次调用 API 函数的错误号。

结果集处理

  1. mysql_data_seek()
    将结果集的行指针移动到指定的偏移量。
  2. mysql_free_result()
    释放一个 MYSQL_RES 结构体及其关联的内存。

字段处理

  1. mysql_field_count()
    返回最近查询的列数(对于非 SELECT 语句,返回受影响的行数)。
  2. mysql_field_seek()
    将字段指针设置到结果集中的给定字段偏移量。

字符集处理

  1. mysql_set_character_set()
    设置连接的默认字符集。

断开连接

  1. mysql_close()
    关闭一个 MySQL 连接。

非阻塞连接

  1. mysql_options()
    设置连接选项,例如使用非阻塞套接字。

其他

  1. mysql_get_host_info()
    返回描述当前连接的字符串。
  2. mysql_get_proto_info()
    返回当前使用的协议版本。
  3. mysql_get_server_info()
    返回 MySQL 服务器的版本字符串。

线程安全
MySQL C API 是线程安全的,但每个线程都应该有自己的 MYSQL 结构体实例。不应在多个线程之间共享 MYSQL 结构体实例。

#include <mysql/mysql.h>int main() {MYSQL *conn;MYSQL_RES *res;MYSQL_ROW row;conn = mysql_init(NULL);if (!mysql_real_connect(conn, "host", "user", "password", "database", 0, NULL, 0)) {fprintf(stderr, "%s\n", mysql_error(conn));exit(1);}if (mysql_query(conn, "SELECT * FROM table")) {fprintf(stderr, "%s\n", mysql_error(conn));exit(1);}res = mysql_use_result(conn);while ((row = mysql_fetch_row(res)) != NULL) {// 处理行数据...}mysql_free_result(res);mysql_close(conn);return 0;
}

2. 连接数据库

将数据库操作的成员数据和成员函数全部放在一个类中封装。

bool SQLInterface::Connect_MySQL()
{mysql_init(&mysqlCon);//mysqlCon 数据库结构 localhost 主机名 root 用户名 "" 密码为空 mytest 数据库 3306 端口if (!mysql_real_connect(&mysqlCon, "localhost", "root", "123456", "stuinfo", 3306, NULL, 0)){AfxMessageBox(_T("访问数据库失败!"));return false;}else{AfxMessageBox(_T("成功连接数据库!"));// 设置字符集, 使程序支持中文。mysql_query(&mysqlCon, "SET NAMES 'GB2312'");//解决从数据库中读取数据后汉字乱码显示的问题 }return true;
}

3. 读取数据库行数据

vector<RowInfo> SQLInterface::Get_All_Info()
{vector<RowInfo> Info;//C语言组合字符串snprintf(sql, SQL_MAX, "SELECT * FROM students_scores");//查询数据int ret = mysql_real_query(&mysqlCon, sql, (unsigned long)strlen(sql));//判断查询结果if (ret){AfxMessageBox(_T("查询失败!"));return Info;}else{res = mysql_store_result(&mysqlCon);   //获取结果集while (row = mysql_fetch_row(res)){RowInfo stuInfo = RowInfo(atoi(row[0]), row[1], row[2],atoi(row[3]),atof(row[4]), atof(row[5]), atof(row[6]));Info.push_back(stuInfo);}}return Info;
}
  • vector Info;中RowInfo结构体用于放置每行的信息

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

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

相关文章

java.lang.LinkageError: 链接错误的正确解决方法,亲测有效,嘿嘿,有效

文章目录 问题分析报错原因解决思路解决方法&#xff08;含代码示例&#xff09;1. 检查类加载器2. 避免在运行时修改类定义3. 更新或修复 JVM4. 检查应用程序的依赖使用 Maven 检查依赖项使用 Gradle 检查依赖项 java.lang.LinkageError 是 Java 虚拟机在尝试链接类定义时发生…

使用echarts绘制中国地图根据不同的省份划分到指定区域里面中

需求:我们在开发过程中会遇到使用中国地图来划分不同区域省份下面的数量统计情况,但是有时候使用Echarts里面地图功能和我们实际业务需求不匹配的,这个时候就需要我们手动自定义进行划分不同区域下面的省份数据。例如大区1下面有哪些省份,大区2对应哪些的省份进行划分显示的…

C++ UTF-8编解码

icu 编解码数据&#xff1a; extern const UConverterSharedData _MBCSData, _Latin1Data, _UTF8Data, _UTF16BEData, _UTF16LEData, _UTF32BEData, _UTF32LEData, _ISO2022Data, _LMBCSData1,_LMBCSData2, _LMBCSData3, _LMBCSData4, _LMBCSData5, _LMBCSDat…

Windows 10新版Outlook使用不便?教你轻松退回旧版windows mail

引言 自从Windows 10推出新版Outlook以来&#xff0c;很多用户反映新版的邮件应用存在诸多不便&#xff0c;尤其是在广告邮件和正常邮件的分类上做得不够理想。面对这一问题&#xff0c;许多用户希望能够退回到Windows自带的旧版Outlook。在本文中&#xff0c;我们将详细介绍一…

数千万“四高”中老年患者,如何推动国产营养保健品创新

“三高”指高血压、高血糖&#xff08;糖尿病&#xff09;、高血脂&#xff0c;是中老年群体的常见病。 然而&#xff0c;除了前述三者&#xff0c;高尿酸血症在我国的患病率正逐年提高&#xff0c;已成为仅次于糖尿病的第二大代谢性疾病。痛风是高尿酸血症典型症状之一。 加上…

用sed去除配置文件空行和注释 去掉注释 #

sed去除注释行&#xff1a;sed -i -c -e /^#/d config_file sed去除空行&#xff1a; sed -i -c -e /^$/d config_file sed去空行和注释行&#xff1a;sed -i -c -e /^$/d;/^#/d config_file [rootrac1 ~]# cat a a b adss afdsf af # o #asd ## asdf # adfas fad af # a …

【数据结构】07.循环队列

一、循环队列的定义 定义&#xff1a;队列主要有顺序队列&#xff0c;循环队列&#xff0c;双端队列&#xff0c;优先队列。而当中循环队列是一种线性数据结构。它也被称为“环形缓冲器”。它只允许在一端进行插入操作&#xff0c;即队尾&#xff08;rear&#xff09;&#xf…

【对顶堆 优先队列】295. 数据流的中位数

本文涉及知识点 对顶堆 优先队列 LeetCode295. 数据流的中位数 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 …

CVE-2019-12272 Openwrt可视页面LuCi命令注入漏洞复现(完结)

声明 本文所使用的一些源代码等内容已经上传至github&#xff0c;具体地址如下 Vulnerability_POC-EXP/OpenWrt/CVE-2019-12272 at main a2148001284/Vulnerability_POC-EXP GitHub 漏洞简介 参考内容&#xff1a; CVE-2019-12272 OpenWrt图形化管理界面LuCI命令注入分析 |…

有哪些有效的策略可以提升独立站的外链数量?

有哪些有效的策略可以提升独立站的外链数量&#xff1f;提升独立站的外链数量并不难&#xff0c;难得是不被谷歌惩罚把你的网站判定为作弊&#xff0c;正因如此&#xff0c;了解并应用GNB自然外链策略是个不错的开始&#xff0c;GNB外链的核心价值在于它提高了网站外链资源的自…

Hazelcast同一个集群发布注意数据一致性与版本兼容性检查示例

Hazelcast Hazelcast是一个开源的、分布式内存数据网格&#xff08;IMDG&#xff0c;In-Memory Data Grid&#xff09;平台&#xff0c;它提供了一系列的分布式数据管理和计算服务。Hazelcast旨在解决大数据和高性能计算场景下的挑战&#xff0c;特别是在分布式系统中提供低延…

【LinuxC语言】线程池之添加工作任务线程

文章目录 前言工作线程工作流程代码介绍函数内容如何去编写代码概况总结前言 在并发编程中,线程池是一种常见的设计模式,它可以有效地管理和控制线程的执行。线程池中的线程可以执行一系列的任务,这些任务通常是独立且相互没有依赖关系的。在Linux C语言环境下,我们可以使…

如何学习和提升SQL

资料来源于腾讯技术直播&#xff0c;只作为学习记录&#xff0c;如有侵权&#xff0c;请联系作者进行删除

Python正则表达式入门用法(下)

Python的正则表达式模块是re。要使用它&#xff0c;需要先导入re模块。下面是一些常用的正则表达式操作&#xff1a; re.match(pattern, string): 从字符串的开始位置匹配一个模式&#xff0c;并返回匹配对象。如果匹配成功&#xff0c;则返回匹配对象&#xff1b;如果匹配失败…

关于单点登录(Single Sign-On,SSO)

业务背景 在企业发展初期&#xff0c;企业使用的系统很少&#xff0c;通常一个或者两个&#xff0c;每个系统都有自己的登录模块&#xff0c;用户用不同的账号即可登录&#xff0c;很方便。 但随着企业的发展&#xff0c;用到的系统随之增多&#xff0c;用户在操作不同的系统时…

分享6个自己每天都会打开的网站

分享6个自己每天都会打开的网站&#xff0c;有实用办公网站&#xff0c;也有休闲摸鱼网站&#xff0c;链接直达&#xff0c;速看~ 1、鸠摩搜索 https://www2.jiumodiary.com/ 一个免费的电子书下载网站&#xff0c;页面干净无广告&#xff0c;只有一个搜索框&#xff0c;输入…

应用了网络变压器的PC网卡连接转换器后不好连网,有掉线现象,但外接路由器无问题,可能是什么原因?

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;今天分享的是应用了网络变压器的PC网卡连接转换器后不好连网&#xff0c;有掉线现象&#xff0c;但外接路由器无问题&#xff0c;可能是什么原因呢&#xff1f;如何解决呢&#xff1f; 首先&#xff0c;我们要了解传…

web前端之浏览器从输入URL到页面展示的过程、建立TCP连接与三次握手、发送HTTP请求、DNS解析、地址、渲染

MENU 前言DNS解析建立TCP连接发送HTTP请求服务器处理请求接收HTTP响应解析HTML解析CSS渲染页面结束 前言 浏览器从输入URL到页面展示的过程&#xff0c;这是一件看似简单却又十分复杂的事情。我们每天都在使用浏览器&#xff0c;却很少关注它们背后的工作原理。本文将从多个方面…

Kotlin/Android中执行网络请求

方式一&#xff1a;使用okhttp3 okhttp官网 okhttp3 github地址 打开build.gradle.kts文件加入依赖 dependencies {implementation("com.squareup.okhttp3:okhttp:4.9.0") }在IDEA的Gradle面板点击reload按钮便会自动下载jar 使用网络请求时需要把网络的权限打开&a…

java必知必会-jsp

文章目录 一、什么是JSP?二、jsp运行原理三、文档结构四、jsp基本语法五、jsp9大内置对象&#xff08;笔试&#xff09;六、el(${el表达式}):Expression Language七、11个内置对象(自定义的数据必须放在域中el才能得到)八、jstl&#xff08;jsp Standard Tag Library)总结 一、…