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

写入本地文件到数据库


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








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值