ado 读写二进制数据

  1. 写二进制数据:
      1. pRs->AppendChunk(_T("tpContent"),buff,dwLen);
  2. 读二进制数据:
    1.   CADOFieldInfo info;   
         pRs->GetFieldInfo(_T("tpcontent"),&info); //topology设备上下文,在数据表中以二进制存在
         void *buff=malloc(info.m_lSize);
         memset(buff,0,info.m_lSize);
         pRs->GetChunk(_T("tpcontent"),buff);  //使用tpcontent字段的内容来填充buff
        

      pRs是自己封装的一个类,CADORecordset,其他的定义:

      _RecordsetPtr m_pRecordset

      BOOL CADORecordset::AppendChunk(LPCTSTR lpFieldName, LPVOID lpData, UINT nBytes)
      {
      
      	FieldPtr pField = m_pRecordset->Fields->GetItem(lpFieldName);
      
      	return AppendChunk(pField, lpData, nBytes);
      }
      
      
      BOOL CADORecordset::AppendChunk(int nIndex, LPVOID lpData, UINT nBytes)
      {
      	_variant_t vtIndex;
      	
      	vtIndex.vt = VT_I2;
      	vtIndex.iVal = nIndex;
      
      	FieldPtr pField = m_pRecordset->Fields->GetItem(vtIndex);
      
      	return AppendChunk(pField, lpData, nBytes);
      }
      
      BOOL CADORecordset::AppendChunk(FieldPtr pField, LPVOID lpData, UINT nBytes)
      {
      	HRESULT hr;
      	_variant_t varChunk;
      	long lngOffset = 0;
      	UCHAR chData;
      	SAFEARRAY FAR *psa = NULL;
      	SAFEARRAYBOUND rgsabound[1];
      
      	try
      	{
      		//Create a safe array to store the array of BYTES 
      		rgsabound[0].lLbound = 0;
      		rgsabound[0].cElements = nBytes;
      		psa = SafeArrayCreate(VT_UI1,1,rgsabound);
      
      		while(lngOffset < (long)nBytes)
      		{
      			chData	= ((UCHAR*)lpData)[lngOffset];
      			hr = SafeArrayPutElement(psa, &lngOffset, &chData);
      
      			if(FAILED(hr))
      				return FALSE;
      			
      			lngOffset++;
      		}
      		lngOffset = 0;
      
      		//Assign the Safe array  to a variant. 
      		varChunk.vt = VT_ARRAY|VT_UI1;
      		varChunk.parray = psa;
      
      		hr = pField->AppendChunk(varChunk);
      
      		if(SUCCEEDED(hr)) return TRUE;
      	}
      	catch(_com_error &e)
      	{
      		dump_com_error(e);
      		return FALSE;
      	}
      
      	return FALSE;
      }
      


       

      BOOL CADORecordset::GetFieldInfo(FieldPtr pField, CADOFieldInfo* fldInfo)
      {
      	memset(fldInfo, 0, sizeof(CADOFieldInfo));
      
      	strcpy(fldInfo->m_strName, (LPCTSTR)pField->GetName());
      	fldInfo->m_lDefinedSize = pField->GetDefinedSize();
      	fldInfo->m_nType = pField->GetType();
      	fldInfo->m_lAttributes = pField->GetAttributes();
      	if(!IsEof())
      		fldInfo->m_lSize = pField->GetActualSize();
      	return TRUE;
      }
      BOOL CADORecordset::GetChunk(LPCTSTR lpFieldName, LPVOID lpData)
      {
      	FieldPtr pField = m_pRecordset->Fields->GetItem(lpFieldName);
      
      	return GetChunk(pField, lpData);
      }
      
      BOOL CADORecordset::GetChunk(int nIndex, LPVOID lpData)
      {
      	_variant_t vtIndex;
      	
      	vtIndex.vt = VT_I2;
      	vtIndex.iVal = nIndex;
      
      	FieldPtr pField = m_pRecordset->Fields->GetItem(vtIndex);
      
      	return GetChunk(pField, lpData);
      }
      
      BOOL CADORecordset::GetChunk(FieldPtr pField, LPVOID lpData)
      {
      	long lngSize, lngOffSet = 0;
      	_variant_t varChunk;    
      	UCHAR chData;
      	HRESULT hr;
      	long lBytesCopied = 0;
      
      	lngSize = pField->ActualSize;
      	
      	while(lngOffSet < lngSize)
      	{ 
      		try
      		{
      			varChunk = pField->GetChunk(ChunkSize);
      
      			//Copy the data only upto the Actual Size of Field.  
                  for(long lIndex = 0; lIndex <= (ChunkSize - 1); lIndex++)
                  {
                      hr= SafeArrayGetElement(varChunk.parray, &lIndex, &chData);
                      if(SUCCEEDED(hr))
                      {
                          //Take BYTE by BYTE and advance Memory Location
                          //hr = SafeArrayPutElement((SAFEARRAY FAR*)lpData, &lBytesCopied ,&chData); 
      					((UCHAR*)lpData)[lBytesCopied] = chData;
                          lBytesCopied++;
                      }
                      else
                          break;
                  }
      			lngOffSet += ChunkSize;
      		}
      		catch(_com_error &e)
      		{
      			dump_com_error(e);
      			return FALSE;
      		}
      	}
      
      	lngOffSet = 0;
      	return TRUE;
      }
      


       

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值