如何用VC++编程实现将一.dwg(CAD图形文件)存到sql server表中的image字段中?存进去后又如何读出显示在窗口中?

解决方案 »

  1.   


    VARIANT varChunk;
    SAFEARRAY *psa;
    SAFEARRAYBOUND rgsabound[1];//VT_ARRAY | VT_UI1
    CFile f("h:\\aaa.dwg",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.dwg",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.   

    .dwg的大小差异很大,放数据库可以使用2进制字段,长度要大于最大.dwg文件大小。
    你可以在数据库里面存放.dwg的文件路径名,通过路径名获取文件~~~.dwg不是点阵图,不同于bmp等图形格式,显示它还是比较难的!!
      

  3.   

    我们目前做的项目也是关于这方面的,是GIS系统,可以将CAD文件用2进制格式存入数据库中,注意,该存储字段格式也为2进制,读的时候,仍然按2进制格式读,形成本地文件后,调用相应的打开方式打开
      

  4.   

    显示DWG?建议你去买OpenDWG库,呵呵,DWG文件是加密的
      

  5.   

    哈哈,在做PDM,这个技巧都用了好多年了,csdn上查"大二进制"