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








相关文章
|
17天前
|
存储 Oracle 关系型数据库
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
130 64
|
7天前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
17 7
|
7天前
|
Oracle 关系型数据库 数据库
oracle数据库技巧
【10月更文挑战第25天】oracle数据库技巧
11 6
|
7天前
|
存储 Oracle 关系型数据库
Oracle数据库优化策略
【10月更文挑战第25天】Oracle数据库优化策略
11 5
|
14天前
|
存储 Oracle 关系型数据库
数据库数据恢复—Oracle ASM磁盘组故障数据恢复案例
Oracle数据库数据恢复环境&故障: Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 ,ASM实例不能mount。 Oracle数据库故障分析&恢复方案: 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储元数据损坏,导致磁盘组无法挂载。
|
16天前
|
监控 Oracle 关系型数据库
Oracle数据库性能优化
【10月更文挑战第16天】Oracle数据库性能优化是
14 1
|
22天前
|
存储 Oracle 关系型数据库
【数据库-Oracle】《Oracle 数据库探秘:基础知识点全攻略》
《Oracle 数据库探秘:基础知识点全攻略》深入介绍 Oracle 数据库的基础知识点,包括数据类型、表结构、查询语句等。通过详细讲解、代码示例和流程图,帮助读者快速掌握 Oracle 数据库的基本操作,为数据库开发和管理打下坚实基础。
26 0
|
2月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
打开oracle数据库报错“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。 数据库没有备份,无法通过备份去恢复数据库。用户方联系北亚企安数据恢复中心并提供Oracle_Home目录中的所有文件,急需恢复zxfg用户下的数据。 出现“system01.dbf需要更多的恢复来保持一致性”这个报错的原因可能是控制文件损坏、数据文件损坏,数据文件与控制文件的SCN不一致等。数据库恢复工程师对数据库文件进一步检测、分析后,发现sysaux01.dbf文件损坏,有坏块。 修复并启动数据库后仍然有许多查询报错,export和data pump工具使用报错。从数据库层面无法修复数据库。
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
|
28天前
|
SQL 存储 Oracle
Oracle数据库SQL语句详解与应用指南
在数字化时代,数据库已成为各类企业和组织不可或缺的核心组件。Oracle数据库作为业界领先的数据库管理系统之一,广泛应用于各种业务场景。掌握Oracle数据库的SQL语句是数据库管理员、开发人员及运维人员的基本技能。本文将详细介绍Oracle数据库SQL语句的基本概念、语法、应用及最佳实践。一、Or
43 3
|
2月前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—异常断电导致Oracle数据库数据丢失的数据恢复案例
Oracle数据库故障: 机房异常断电后,Oracle数据库启库报错:“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。数据库没有备份,归档日志不连续。用户方提供了Oracle数据库的在线文件,需要恢复zxfg用户的数据。 Oracle数据库恢复方案: 检测数据库故障;尝试挂起并修复数据库;解析数据文件。

推荐镜像

更多