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);
}
}
数据库读取和存储大型数据(图片、音视频文件)的函数封装
最新推荐文章于 2024-07-30 14:24:53 发布