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








相关文章
|
4天前
|
DataWorks Oracle 关系型数据库
DataWorks操作报错合集之尝试从Oracle数据库同步数据到TDSQL的PG版本,并遇到了与RAW字段相关的语法错误,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
17 0
|
3天前
|
数据库
数据库字段
数据库字段
|
4天前
|
分布式计算 关系型数据库 大数据
MaxCompute产品使用合集之怎么才可以将 PostgreSQL 中的 geometry 空间类型字段同步到 MaxCompute 或另一个 PostgreSQL 数据库
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
10天前
|
存储 Oracle 网络协议
Oracle 11gR2学习之二(创建数据库及OEM管理篇)
Oracle 11gR2学习之二(创建数据库及OEM管理篇)
|
14天前
|
Oracle 网络协议 关系型数据库
异地使用PLSQL远程连接访问Oracle数据库【内网穿透】
异地使用PLSQL远程连接访问Oracle数据库【内网穿透】
|
2天前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
2天前
|
SQL 关系型数据库 MySQL
【MySQL-5】DDL的数据库操作:查询&创建&删除&使用(可cv代码+演示图)
【MySQL-5】DDL的数据库操作:查询&创建&删除&使用(可cv代码+演示图)
|
2天前
|
SQL 关系型数据库 MySQL
【MySQL-1】理解关系型数据库&数据的数据模型
【MySQL-1】理解关系型数据库&数据的数据模型
|
3天前
|
关系型数据库 MySQL 数据库
Docker数据库Mysql
Docker数据库Mysql
|
4天前
|
存储 SQL 关系型数据库
mysql查询数据库表大小怎么操作
mysql查询数据库表大小怎么操作

推荐镜像

更多