是否需要用到CLongbinary或者其他CFile的东西,请给个大概的思路,谢谢

解决方案 »

  1.   

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

  2.   

    请参考http://www.vckbase.com/vckbase/vckbase10/vc/nonctrls/database_07/1007003.htm
    文章和代码对这很有帮助