大家好怎样读取blob类型的数据

解决方案 »

  1.   

    HGLOBAL hgImageMem = NULL;
    LPVOID lpvImageMem = NULL; long lImageSize = rs->GetFields()->GetItem("图片")->ActualSize;if(lImageSize > 0)
    {
           _variant_t varImage;
           varImage = rs->GetFields()->GetItem("图片")->GetChunk(lImageSize);
          if(varImage.vt == (VT_ARRAY | VT_UI1))
    {

    hgImageMem = GlobalAlloc(GHND, lImageSize);
    if(hgImageMem!=NULL)
    {
       lpvImageMem = GlobalLock( hgImageMem);
       char *pBuffer= NULL;
       SafeArrayAccessData(varImage.parray,(void **)&pBuffer);
       CopyMemory(lpvImageMem,pBuffer,lImageSize);
       SafeArrayUnaccessData (varImage.parray);
                          CFile file("a.jpg",CFile::modeWrite|CFile::modeCreate);
       file.Write(lpvImageMem,lImageSize);
       file.Close();
                        }
                }
    } GlobalUnlock(hgImageMem);
    lpvImageMem=NULL;
    GlobalFree(hgImageMem);
      

  2.   

    从数据库中读取到richedit _bstr_t bstrConn="Provider=Microsoft.Jet.OLEDB.4.0;"
    "Data Source=E:\\vc\\test.mdb;"
    "User Id=Admin;Password=;"; _RecordsetPtr rs=NULL;
    long  lLength=0L;
    _variant_t varText; try
    {
    rs.CreateInstance(__uuidof(Recordset));
    rs->Open("[longText]",bstrConn, adOpenKeyset, adLockOptimistic, adCmdTable);
    if(!rs->GetBOF())
    rs->MoveFirst();
    lLength= rs->GetFields()->GetItem("text")->ActualSize;
    LPTSTR pszBuffer= NULL;
    varText = rs->GetFields()->GetItem("text")->GetChunk(lLength);
    if(varText.vt == (VT_ARRAY | VT_UI1))
    {
    SafeArrayAccessData(varText.parray,(void **)&pszBuffer);
    CopyMemory(m_strRichedit.GetBufferSetLength(lLength),pszBuffer,lLength);
    SafeArrayUnaccessData (varText.parray);
    } }
    catch (_com_error e) 
    {
    PrintComError(e);
    }
    rs->Close();
    UpdateData(FALSE);
      

  3.   

    11. 访问长数据
    在Microsoft SQL中的长数据包括text、image等这样长类型的数据,作为二进制字节来对待。
    可以用Field对象的GetChunk和AppendChunk方法来访问。每次可以读出或写入全部数据的一部分,它会记住上次访问的位置。但是如果中间访问了别的字段后,就又得从头来了。
    请看下面的例子:
    //写入一张照片到数据库:
    VARIANT varChunk;
    SAFEARRAY *psa;
    SAFEARRAYBOUND rgsabound[1];//VT_ARRAY | VT_UI1
    CFile f("h:\\aaa.jpg",CFile::modeRead);
    BYTE  bVal[ChunkSize+1];
    UINT uIsRead=0;
    //Create a safe array to store the array of BYTES  
    while(1)
    {
     uIsRead=f.Read(bVal,ChunkSize);
     if(uIsRead==0)break;
     rgsabound[0].cElements =uIsRead;
        rgsabound[0].lLbound = 0;
     psa = SafeArrayCreate(VT_UI1,1,rgsabound);
     for(long index=0;index<uIsRead;index++)          
     {
      if(FAILED(SafeArrayPutElement(psa,&index,&bVal[index])))
      ::MessageBox(NULL,"啊,又出毛病了。","提示",MB_OK | MB_ICONWARNING);
     }
     varChunk.vt = VT_ARRAY|VT_UI1;
     varChunk.parray = psa;
     try{
      m_pRecordset->Fields->GetItem("photo")->AppendChunk(varChunk); 
     }
     catch (_com_error &e)
     {
      CString str=(char*)e.Description();
      ::MessageBox(NULL,str+"\n又出毛病了。","提示",MB_OK | MB_ICONWARNING);
     }
     ::VariantClear(&varChunk);
     ::SafeArrayDestroyData( psa);
     if(uIsRead<ChunkSize)break;
    }//while(1)  
    f.Close();//从数据库读一张照片:
    CFile f;
    f.Open("h:\\bbb.jpg",CFile::modeWrite|CFile::modeCreate);
    long lPhotoSize = m_pRecordset->Fields->Item["photo"]->ActualSize;  
    long lIsRead=0;_variant_t varChunk;
    BYTE buf[ChunkSize];
    while(lPhotoSize>0)
    {
     lIsRead=lPhotoSize>=ChunkSize? ChunkSize:lPhotoSize;
     varChunk = m_pRecordset->Fields->
                      Item["photo"]->GetChunk(lIsRead);
     for(long index=0;index<lIsRead;index++)         
     {           
      ::SafeArrayGetElement(varChunk.parray,&index,buf+index);   
     }
     f.Write(buf,lIsRead);
     lPhotoSize-=lIsRead;
    }//while()
    f.Close();