SQLSERVER的数据库,ado如何读出二进制的数据

解决方案 »

  1.   

    http://dev.csdn.net/develop/article/21/21088.shtm
      

  2.   

    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=185973
      

  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();
      

  4.   

    http://www.vckbase.com/document/viewdoc/?id=252
      

  5.   

    建议用:
    _StreamPtr对象可直接读取文件,然后挂接数据库的_RecordSetPtr,再后Update即可