数据库读取和存储大型数据(图片、音视频文件)的函数封装

LONG ADORecordset::GetChunk( const CString& strIndex, BYTE* buf /*= NULL*/, LONG len /*= 0*/) const
{ //从数据库中某字段取数据
	ASSERT(m_pRecordset != NULL);
	LONG ret = 0;
	try
	{
		if ( buf == NULL || len == 0 )
		{
			ret = m_pRecordset->GetFields()->GetItem( _variant_t(strIndex) )->ActualSize;
		}
		else
		{
			_variant_t varBLOB;	
			varBLOB = m_pRecordset->GetFields()->GetItem( _variant_t(strIndex) )->GetChunk(len);		
			if(varBLOB.vt == (VT_ARRAY | VT_UI1)) ///判断数据类型是否正			
			{
				char *pBuf = NULL;
				SafeArrayAccessData(varBLOB.parray,(void **)&pBuf); 
				memcpy( buf, pBuf, len);
				//得到指向数据的指针 
				/*****在这里我们可以对pBuf中的数据进行处理*****/	
				SafeArrayUnaccessData (varBLOB.parray);	
				ret = len;
			}
		}
	}
	catch (_com_error e)
	{
		throw new ADOException(e);
	}
	return ret;
	
}

void ADORecordset::SetChunk( const CString& strIndex, BYTE* buf, int len)
{//将数据存入数据库中某字段
	ASSERT(m_pRecordset != NULL);
	if ( NULL == buf || len <= 0 ) return;
	try
	{
		VARIANT varBLOB;
		SAFEARRAY *psa;
		SAFEARRAYBOUND rgsabound[1];
		rgsabound[0].lLbound = 0;		
		rgsabound[0].cElements = len;	
		psa = SafeArrayCreate(VT_UI1, 1, rgsabound); ///创建SAFEARRAY对象		
		for (long i = 0; i < (long)len; i++)		
			SafeArrayPutElement (psa, &i, buf++); ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中 		
		varBLOB.vt = VT_ARRAY | VT_UI1;///将varBLOB的类型设置为BYTE类型的数组	
		varBLOB.parray = psa; ///为varBLOB变量赋值 
		m_pRecordset->GetFields()->GetItem( _variant_t(strIndex) )->AppendChunk(varBLOB); ///加入BLOB类型的数据
		SafeArrayDestroy(psa);
	}
	catch (_com_error e)
	{
		throw new ADOException(e);
	}
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值