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.mfbz.cn/a/775581.html

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

相关文章

VCS+Vivado联合仿真BUG

场景&#xff1a; 在vcsvivado联合仿真过程中&#xff0c;对vivado导出的shell脚本修改&#xff0c;修改某些source文件路径&#xff0c;vcs编译时会报Permission Denied。 问题描述 对shell脚本修改如下&#xff1a; 修改仅为注释掉某一行&#xff0c;下面变为source文件新…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【20】认证服务04—SSO单点登录

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【20】认证服务04—SSO单点登录 xxl-sso多系统-单点登录单点登录流程原理图单点登录流程简单实现参考 xxl-sso https://gitee.com/xuxueli0323/xxl-sso xxl-sso是开源的一个单点登录框架 …

交换机基本原理

文章目录 前言一、交换机的转发行为二、交换机的转发原理1.MAC地址表2.交换机初始状态3.学习MAC地址4.ARP协议5.交换机转发数据帧6.目标主机回复 三、华为交换机基本命令1.VRP视图分层2.命令行补全3.命令行帮助4.配置设备名称5.命令等级6.用户界面7.配置console认证8.配置用户界…

Ubuntu系统复制文件到共享文件夹出错

1、问题描述 Ubuntu系统复制文件到共享文件夹时&#xff0c;出现拼接文件时出错&#xff1a;输入/输出错误。 使用cp命令&#xff1a; cp -Rf XXX YYY 也是出错&#xff1a; cp: 写入 xxx 出错: 输入/输出错误 2、查看磁盘空间 查看磁盘空间&#xff0c;显示空间还有剩余…

Day05-组织架构-角色管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.组织架构-编辑部门-弹出层获取数据2.组织架构-编辑部门-编辑表单校验3.组织架构-编辑部门-确认取消4.组织架构-删除部门5.角色管理-搭建页面结构6.角色管理-获取数…

第一次的pentest show总结

第一次的pentest show总结 前言 开始之前&#xff0c;我特别感谢TryHackMe(英)、HackTheBox(美)、zero-point security(英)、offsec(美)等平台&#xff0c;使我们能够通过网络以线上的方式学习与练习&#xff0c;打破传统线下各地区教育资源差异大的限制&#xff0c;对网络教…

探索Sui的面向对象模型和Move编程语言

Sui区块链作为一种新兴的一层协议&#xff08;L1&#xff09;&#xff0c;采用先进技术来解决常见的一层协议权衡问题。Cointelegraph Research详细剖析了这一区块链新秀。 Sui使用Move编程语言&#xff0c;该语言专注于资产表示和访问控制。本文探讨了Sui的对象中心数据存储模…

Python从0到100(三十七):数据提取的概念和数据分类

1. 爬虫中数据的分类 在爬虫开发过程中,我们会遇到多种类型的数据。了解这些数据的类型对于有效地提取和解析信息至关重要。 结构化数据 结构化数据是指具有固定格式和模式的数据,常见的结构化数据格式包括JSON和XML。 处理方式:可以直接转换为Python的字典或列表等数据类…

【UML用户指南】-27-对体系结构建模-制品

目录 1、组成结构 2、制品的种类 2.1、部署制品 &#xff08;deployment artifact&#xff09; 2.2、工作产品制品 &#xff08;work product artifact&#xff09; 2.3、执行制品 &#xff08;execution artifact&#xff09; 3、标准元素 4、常用建模技术 4.1、对可执…

Redis 7.x 系列【17】四种持久化策略

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 案例演示2.1 无持久化2.2 RDB2.3 AOF2.4 混合模式2.4.1 方式一&#xff1a;…

LLM - 神经网络的组成

1. 一个神经元的结构&#xff1a;即接受多个输入X向量&#xff0c;在一个权重向量W和一个偏执标量b的作用下&#xff0c;经过激活函数后&#xff0c;产生一个输出。 2. 一层神经网络的结构&#xff1a;该层网络里的每个神经元并行计算&#xff0c;得到各自的输出;计算方式是输入…

CISAW证书考完有什么用?值得投资吗?

CISAW证书&#xff0c;在信息安全领域内被公认为具有高价值的一种职业资格认证&#xff0c;它象征着持有者在该领域的专业技能和知识水平。 因此&#xff0c;CISAW证书不仅具有实质性的价值&#xff0c;还能为持有者带来诸多益处。 首先&#xff0c;拥有CISAW证书的专业人士更…

简过网:教师编制报考要求和条件,都给你汇总好了!

如果你想要考教师编&#xff0c;那么在考试之前你先要明白这些知识&#xff01; ​ 一、什么是教师编&#xff1f; 在编教师拥有的编制为事业编&#xff0c;即在编老师为事业单位工作人员 二、考教师编需要什么条件&#xff1f; 1、普通话 语文学科普通话要求达到二级甲等及…

5.基于SpringBoot的SSMP整合案例-数据层开发

目录 1.新建项目 2.实体类开发&#xff1a; 2.1在pom.xml中增加Lombok坐标&#xff1a; 2.2添加Book实体类 3.数据层开发&#xff1a; 3.1 配置MyBatisPlus与Druid 3.2创建数据层接口 3.3写测试类 3.4点击运行&#xff1a; 4.数据层快速开发&#xff1a; 4.1配置MyB…

Camera link(学习笔记)

Camera Link协议是一种专门针对机器视觉应用领域的串行通信协议&#xff0c;它使用低压差分信号(LVDS)进行数据的传输和通信。Camera Link标准是在ChannelLink标准的基础上多加了6对差分信号线&#xff0c;其中4对用于并行传输相机控制信号&#xff0c;另外2对用于相机和图像采…

植物学(书籍学习资料)

包含观赏植物学、植物学、植物学百科图鉴等多本植物学方面的书籍学习资料。 图2、3为观赏植物学截图&#xff1b; 图4、5为植物学百科图鉴截图&#xff1b; 图6、7为植物学学习指南截图。

YOLO V7项目使用

YOLO V7项目使用 根据官方论文中提供的项目地址&#xff1a;使用git clone将项目下载到本地。 https://github.com/WongKinYiu/yolov7 git clone https://github.com/WongKinYiu/yolov7 使用pycharm打开项目&#xff0c;根据官方提供的requirement.txt文件下载项目启动所需要的…

ERROR | Web server failed to start. Port 8080 was already in use.

错误提示&#xff1a; *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 8080 was already in use.Action:Identify and stop the process thats listening on port 8080 or configure thi…

ubuntu下后台启动程序

1.启动 nohup python detect_mq.py > output.out 2>&1 & 这个命令是用来在后台运行一个 Python 脚本 detect_mq.py&#xff0c;并将脚本的输出重定向到文件 output.out。下面是这个命令的详细解释&#xff1a; nohup&#xff1a;这是一个命令&#xff0c;它告诉…

【东奥会计-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…