IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> C++获取mysql中Blob字段的数据(图片)一 -> 正文阅读

[大数据]C++获取mysql中Blob字段的数据(图片)一

方法二:https://zhangzc.blog.csdn.net/article/details/124158038

1、使用到的主要函数说明:

(1)、mysql_real_query()

int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)

对于包含二进制数据的查询,必须使用mysql_real_query()而不是mysql_query(),这是因为,二进制数据可能会包含‘\0’字符。此外,mysql_real_query()比mysql_query()快,这是因为它不会在查询字符串上调用strlen()。

如果查询成功,返回0。如果出现错误,返回非0值。

(2)、mysql_store_result()

MYSQL_RES *mysql_store_result(MYSQL *mysql) 

对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。

对于其他查询,不需要调用mysql_store_result()或mysql_use_result(),但是如果在任何情况下均调用了mysql_store_result(),它也不会导致任何伤害或性能降低。通过检查mysql_store_result()是否返回0,可检测查询是否没有结果集(以后会更多)。

mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。

如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。

如果读取结果集失败,mysql_store_result()还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。

一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。

可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。

一旦完成了对结果集的操作,必须调用mysql_free_result()。

具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL。

(3)、mysql_num_fields()

unsigned int mysql_num_fields(MYSQL_RES *result)

返回结果集中的字段数。

(4)、mysql_fetch_fields()

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result) 

对于结果集,返回所有MYSQL_FIELD结构的数组。每个结构提供了结果集中1列的字段信息。

2、实例:

(1)、要查询的数据表结构:

?(2)源码:

// mySqlTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <mysql.h>
using namespace std;

int main()
{
	//1.初始化环境
	MYSQL* mySql = mysql_init(NULL);
	if (mySql == NULL)
	{
		printf("数据库环境初始化失败!\n");
		return -1;
	}

	//2.连接数据库
	mySql = mysql_real_connect(mySql, "localhost", "root", "root", "zzc", 3306, NULL, 0);
	if (mySql == NULL)
	{
		printf("数据库连接失败!\n");
		return -1;
	}

	//mysql_set_character_set(mySql, "gbk");

	//执行查询
	char sql[] = "select id, name, time, photo from student where id = 1003";
	if (0 != mysql_real_query(mySql, sql, strlen(sql)))
	{
		printf(" %s\n", mysql_error(mySql));
	}

	//获取结果集
	MYSQL_RES * result = NULL;
	result = mysql_store_result(mySql);
	if (NULL == result)
	{
		printf(" %s\n", mysql_error(mySql));
	}

	//循环获取每一行数据数据
	MYSQL_ROW m_row = nullptr;
	//获取字段总数
	int fieldCount = mysql_num_fields(result);
	//获取一行数据的字段信息
	MYSQL_FIELD *fields = mysql_fetch_fields(result);

	while (m_row = mysql_fetch_row(result))
	{
		for (int i = 0;i < fieldCount; ++i)
		{
			if (fields[i].type == MYSQL_TYPE_BLOB)
			{
				unsigned long length = mysql_fetch_lengths(result)[i];
				char* buffer = new char[length + 1];
				memset(buffer, 0x00, sizeof(buffer));

				memcpy(buffer, m_row[i], length);

				stringstream pic_name;
				pic_name << "D:\\test.jpg";
				ofstream outfile(pic_name.str(), ios::binary);
				outfile.write(buffer, length);

				if (buffer) delete[] buffer;
			}
			else if (fields[i].type == MYSQL_TYPE_VAR_STRING)
			{
				char* val = m_row[i];
				unsigned long length = mysql_fetch_lengths(result)[i];
				if (val)
				{
					cout << string(val, length) << "\t";
				}
			}
			else if (fields[i].type == MYSQL_TYPE_DATETIME)
			{
				char* val = m_row[i];
				unsigned long length = mysql_fetch_lengths(result)[i];
				if (val)
				{
					cout << string(val, length) << "\t";
				}
			}
			else if (fields[i].type == MYSQL_TYPE_LONG)
			{
				int val = atoi(m_row[i]);
				cout << val << "\t";
			}
		}
		cout << endl;
	}

	//释放资源-结果集
	if (result)
	{
		mysql_free_result(result), result = nullptr;
	}

	//释放资源-数据库
	if (mySql)
	{
		mysql_close(mySql);
	}
	
}

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:05:37  更:2022-04-15 00:08:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:51:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码