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

C++获取mysql中Blob字段的数据(图片)一,第1张

方法二: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 #include #include #include #include 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); } }

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/634714.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-16
下一篇 2022-04-16

发表评论

登录后才能评论

评论列表(0条)

保存