c++写入oracle数据库blob字段,读取blob到本地文件

简介: 版权声明:欢迎评论和转载,转载请注明来源。 https://blog.csdn.net/zy332719794/article/details/7407158 写入本地文件到数...
版权声明:欢迎评论和转载,转载请注明来源。 https://blog.csdn.net/zy332719794/article/details/7407158

写入本地文件到数据库


void DlgImpRoadSection::OnOkBtnClicked()
{
	#pragma region 验证

	CString tempStr;

	CString fileName;
	m_FilePath.GetWindowText(fileName);
	if (access((const char*)_bstr_t(fileName), 0) != 0)
	{
		ads_alert(L"文件不存在!");
		return;
	}

	...

	#pragma endregion

	#pragma region 以二进制形式读文件。存入varBlob

	CFile file;
	if (file.Open(fileName, CFile::modeRead|CFile::typeBinary) == FALSE)
	{
		return;
	}

	long fileLen = file.GetLength(); // 文件长度

	// 存放文件二进制流的指针
	byte *fileBuffer = new byte[fileLen + 1]; 
	file.Read(fileBuffer, fileLen);
	file.Close();

	// 指定一个一维安全数组(safe array)的边界
	SAFEARRAYBOUND rgsabound[1]; 
	rgsabound[0].lLbound = 0;
	rgsabound[0].cElements = fileLen;

	// 安全数组
	SAFEARRAY *safeArray; 
	safeArray = SafeArrayCreate(VT_UI1, 1, rgsabound);  

	for (long i = 0; i < fileLen; i++)
	{
		SafeArrayPutElement (safeArray, &i, fileBuffer++); 
	}

	// 存入数据库中的BLOB的类型数据。设置为BYTE类型的数组
	VARIANT varBLOB;
	varBLOB.vt = VT_ARRAY | VT_UI1;
	varBLOB.parray = safeArray; 

	#pragma endregion

	#pragma region 插入记录

	CString sql = L"select * from TABLE_NAME where 1 = 0";

	_RecordsetPtr rs;
	rs.CreateInstance(__uuidof(Recordset));

	try
	{
		if (rs->Open(sql.GetBuffer(0), g_conn.GetInterfacePtr(), 
			adOpenDynamic, adLockOptimistic, adCmdText) == S_FALSE)
		{
			return;
		}

		GUID guid;
		CoCreateGuid(&guid);
		CString id;
		id.Format(L"%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X", 
			guid.Data1, guid.Data2, guid.Data3, 
			guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], 
			guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);

		rs->AddNew();

		rs->PutCollect("ID", _variant_t(id));
		rs->PutCollect("...", ...);

		rs->PutCollect("CAD_FILE", _variant_t(""));
		rs->GetFields()->GetItem("FILE")->AppendChunk(varBLOB);

		if (rs->Update() == S_OK)
		{
			...
		}
		else
		{
			...
		}
	}
	catch(...)
	{
		...		
	}

	rs = NULL;

	#pragma endregion

	CDialog::OnOK();
}


读取数据库blob字段值,存到本地文件。


#pragma region 从数据库读取文件存到本地

	CString tempFile; // 要存储到本地文件名。
	_RecordsetPtr rs;
	rs.CreateInstance(__uuidof(Recordset));

	CString sql;
	sql.Format(L"select FILE from tablename where id = '%s'", id);

	try
	{		
		if (rs->Open(sql.GetBuffer(0), g_conn.GetInterfacePtr(), 
			adOpenDynamic, adLockOptimistic, adCmdText) == S_FALSE)
		{
			return false;
		}

		if (rs->adoEOF)
		{
			return false;
		}

		long dataSize = rs->GetFields()->GetItem("FILE")->ActualSize;

		if (dataSize < 0)
		{
			return false;
		}

		_variant_t varBlob = rs->GetFields()->GetItem("FILE")->GetChunk(dataSize);;

		if(varBlob.vt == (VT_ARRAY | VT_UI1)) //判断数据类型是否正确
		{
			char *pBuf = NULL;
			SafeArrayAccessData(varBlob.parray, (void **)&pBuf); //得到指向数据的指针

			CFile cadFile;

			tempFile = appPath + "\\temp.dwg";;

			if (cadFile.Open(tempFile, 
				CFile::modeCreate|CFile::modeWrite|CFile::typeBinary) == FALSE)
			{
				return false;
			}

			cadFile.Write(pBuf, dataSize);
			cadFile.Close();

			SafeArrayUnaccessData (varBlob.parray);			
		}
	}
	catch (...)
	{
		return false;
	}

	#pragma endregion








相关文章
|
7月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】Oracle数据库配置助手:DBCA
Oracle数据库配置助手(DBCA)是用于创建和配置Oracle数据库的工具,支持图形界面和静默执行模式。本文介绍了使用DBCA在Linux环境下创建数据库的完整步骤,包括选择数据库操作类型、配置存储与网络选项、设置管理密码等,并提供了界面截图与视频讲解,帮助用户快速掌握数据库创建流程。
623 93
|
6月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】使用NetManager创建Oracle数据库的监听器
Oracle NetManager是数据库网络配置工具,用于创建监听器、配置服务命名与网络连接,支持多数据库共享监听,确保客户端与服务器通信顺畅。
340 0
|
9月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。
|
7月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
479 8
|
存储 Oracle 关系型数据库
【YashanDB 知识库】YMP 校验从 yashandb 同步到 oracle 的数据时,字段 timestamp(0) 出现不一致
在YMP校验过程中,从yashandb同步至Oracle的数据出现timestamp(0)字段不一致问题。原因是yashandb的timestamp(x)存储为固定6位小数,而Oracle的timestamp(0)无小数位,同步时会截断yashandb的6位小数,导致数据差异。受影响版本:yashandb 23.2.7.101、YMP 23.3.1.3、YDS联调版本。此问题会导致YMP校验数据内容不一致。
|
9月前
|
SQL Oracle 关系型数据库
比较MySQL和Oracle数据库系统,特别是在进行分页查询的方法上的不同
两者的性能差异将取决于数据量大小、索引优化、查询设计以及具体版本的数据库服务器。考虑硬件资源、数据库设计和具体需求对于实现优化的分页查询至关重要。开发者和数据库管理员需要根据自身使用的具体数据库系统版本和环境,选择最合适的分页机制,并进行必要的性能调优来满足应用需求。
433 11
|
9月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—服务器异常断电导致Oracle数据库报错的数据恢复案例
Oracle数据库故障: 某公司一台服务器上部署Oracle数据库。服务器意外断电导致数据库报错,报错内容为“system01.dbf需要更多的恢复来保持一致性”。该Oracle数据库没有备份,仅有一些断断续续的归档日志。 Oracle数据库恢复流程: 1、检测数据库故障情况; 2、尝试挂起并修复数据库; 3、解析数据库文件; 4、导出并验证恢复的数据库文件。
|
9月前
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle RMAN的目录数据库
Oracle RMAN默认将备份元信息存储在控制文件中,但控制文件损坏或丢失会导致恢复失败,且备份增多会使控制文件无限增长。为解决这些问题,Oracle引入了RMAN目录数据库(Catalog Database),专门用于存储RMAN备份的元信息。使用目录数据库可提升备份管理效率,支持多数据库共享、长期备份历史记录存储,并可保存RMAN脚本。本文详细介绍了如何创建目录数据库、注册目标数据库及其操作步骤。
259 0
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
2389 28
|
SQL 数据库连接 数据库
在C++的QT框架中实现SQLite数据库的连接与操作
以上就是在C++的QT框架中实现SQLite数据库的连接与操作的基本步骤。这些步骤包括创建数据库连接、执行SQL命令、处理查询结果和关闭数据库连接。在实际使用中,你可能需要根据具体的需求来修改这些代码。
771 14

推荐镜像

更多
下一篇
开通oss服务