用ADO操作ORACLE的BLOB字段

 
//用ADO操作ORACLE的BLOB字段
//用AppendChunk向BLOB字段插入数据
try
{
	_variant_t val;
	TCHAR szSql[2048] = {0};

	CFile file;
	file.Open(chFilePath, CFile::modeRead);
	ULONGLONG nLength = file.GetLength();
	BYTE* pBuf = new BYTE[nLength + 2];

	file.Read(pBuf, (UINT)nLength);
	BYTE* pBufEx = pBuf;

	SAFEARRAY* psa;
	SAFEARRAYBOUND rgsabound[1];
	rgsabound[0].lLbound = 0;
	rgsabound[0].cElements = (ULONG)nLength;
	psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
	for (long i = 0; i < nLength; i++)
		SafeArrayPutElement(psa, &i, pBufEx++);

	VARIANT varBLOB;
	varBLOB.vt = VT_ARRAY | VT_UI1;
	varBLOB.parray = psa;
	CString strSql = "select * from tableX where ID = ";
	char ID[100] = {0};
	sprintf_s(ID, "\'%s\'", chID);
	strSql += ID;
	_RecordsetPtr rsp;
	rsp.CreateInstance(__uuidof(Recordset));
	m_pConnection->CursorLocation = adUseClient;
	hr = rsp->Open(_variant_t(strSql), _variant_t(m_pConnection.GetInterfacePtr()), adOpenStatic, adLockOptimistic, adCmdText);
	long conut = rsp->GetFields()->GetCount();
	rsp->GetFields()->GetItem("DATA")->AppendChunk(varBLOB);
	rsp->Update();

	::VariantClear(&varBLOB);
	::SafeArrayDestroyData( psa);
}
catch (_com_error& e)
{
	CString strError;
	strError.Format(_T("插入消息到数据库失败!\r\n失败原因:%s"), (LPCTSTR)e.Description());
	OutputDebugString(strError);
	return -1;
}

// 用GetChunk获取BLOB字段的数据
try
{
	HRESULT hr;
	_RecordsetPtr rsp;
	rsp.CreateInstance(__uuidof(Recordset));
	char ID[100] = {0};
	sprintf_s(ID, "\'%s\'", chID);
	CString strSql = "select * from tableX where ID =";
	strSql += ID;
	m_pConnection->CursorLocation = adUseClient;
	hr = rsp->Open(_variant_t(strSql), _variant_t(m_pConnection.GetInterfacePtr()), adOpenStatic, adLockOptimistic, adCmdText);


	long dataSize = rsp->GetFields()->GetItem("DATA")->ActualSize;
	if (dataSize > 0)
	{
		_variant_t varBlob;
		varBlob = rsp->GetFields()->GetItem("DATA")->GetChunk(dataSize);
		if (varBlob.vt == (VT_ARRAY | VT_UI1))
		{
			BYTE* pBuf = NULL;
			pBuf = (BYTE*)GlobalAlloc(GMEM_FIXED, dataSize);
			SafeArrayAccessData(varBlob.parray, (void**)&pBuf);
			CFile f(strPath, CFile::modeCreate | CFile::modeWrite);
			LPSTR buffer = (LPSTR)GlobalLock((HGLOBAL)pBuf);
			f.Write(buffer, dataSize);
			GlobalUnlock((HGLOBAL)pBuf);
			f.Close();
			SafeArrayUnaccessData(varBlob.parray);
		}
	}
}
catch (_com_error& e)
{
	CString strError;
	strError.Format(_T("插入消息到数据库失败!\r\n失败原因:%s"), (LPCTSTR)e.Description());
	OutputDebugString(strError);
	return -1;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值