我想实现将一个EXCEL或WORD文件转换成二进制文件然后再存入SQL的varBinary字段中最后读取varBinary转换成EXCEL或WORD不知从何下手
如何将EXCEL或WORD文件转换成二进制文件啊

解决方案 »

  1.   

    当然,如果文件的格式什么的也需要的话,可能真的是需要整个文件保存那么可以考虑使用BLOB或者别的,类似BS应用中的附件上传的管理
      

  2.   

    楼上的说的我感觉比转换成二进制在存到SQL中更麻烦啊!现在连怎么转换成二进制都实现不了谁来帮帮我啊 
      

  3.   

    FILE等方式读取, IOS_Binary 二进制方式打开读取文件好了...
    fread
      

  4.   


    比如用CFile 读取
        CFile file ; 
        if(!file.Open("d:\\1.xls",CFile::modeReadWrite|CFile::typeBinary,NULL)) 
        { 
            AfxMessageBox("打开文件失败!") ; 
            return ; 
        } 
        char *pBuffer = new char[file.GetLength() + 1] ; 
        pBuffer[file.GetLength()] = 0 ; 
        file.Seek(0, CFile::begin) ; 
        file.Read(pBuffer,file.GetLength()) ; 
        file.Close() ;
    读完了把什么保存到SQL的varBinary字段中反过来又怎么把varBinary字段中的内容转换成EXCEL或WORD文件?
      

  5.   

    你的意思是把file.Read(pBuffer,file.GetLength()) ;
    中的pBuffer写到数据库?? 
      

  6.   


    我现在直接读然后不保存SQL直接写到EXCEL中,最后写入的那个打开内容是空的啊
        CFile file ; 
        if(!file.Open("d:\\1.xls",CFile::modeReadWrite|CFile::typeBinary,NULL)) 
        { 
            AfxMessageBox("打开文件失败!") ; 
            return ; 
        } 
        char *pBuffer = new char[file.GetLength() + 1] ; 
        pBuffer[file.GetLength()] = 0 ; 
        file.Seek(0, CFile::begin) ; 
        file.Read(pBuffer,file.GetLength()) ; 
        file.Close() ;     file.Open("d:\\2.xls",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary) ; 
        file.Write(pBuffer,file.GetLength()) ; 
        file.Close();
         //1.xls和2.xls内容不一样,2.xls是空的
          //为什么啊?
      

  7.   

    //为什么啊?
    因为你写入的长度是0。先把第一个文件的长度保存下来:    CFile file ; 
        if(!file.Open("d:\\1.xls",CFile::modeRead,NULL)) 
        { 
            AfxMessageBox("打开文件失败!") ; 
            return ; 
        }
        DWORD nFileSize = file.GetLength();
        char *pBuffer = new char[nFileSize] ; 
        DWORD nReadLen = file.Read(pBuffer, nFileSize) ; 
        file.Close() ;     file.Open("d:\\2.xls",CFile::modeCreate|CFile::modeWrite) ; 
        file.Write(pBuffer, nReadLen); 
        file.Close();
      

  8.   

    非常感谢楼上的.那往数据库写入是写pBuffer吗??
    应该写入到哪种类型的字段啊??
      

  9.   


        CFile file ; 
        if(!file.Open("d:\\1.xls",CFile::modeRead,NULL)) 
        { 
            AfxMessageBox("打开文件失败!") ; 
            return ; 
        }
        DWORD nFileSize = file.GetLength();
        char *pBuffer = new char[nFileSize] ; 
        DWORD nReadLen = file.Read(pBuffer, nFileSize) ; 
        file.Close() ; ........//连接SQL成功
    try
    {
    sql.Format("INSERT INTO FLOW (item,longs) VALUES ('%s',%d)",pBuffer,nReadLen);
    m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);
    }
    catch(_com_error e)
    {
    AfxMessageBox(errormessage);
    return ;
    }为什么我把读到的pBuffer和nReadLen,写入到SQL的item和longs字段老是出错,item类型为nvarchar,longs字段为int
      

  10.   


    sql.Format("INSERT INTO FLOW (item,longs) VALUES (\'%s\',%d)",pBuffer,nReadLen);
      

  11.   

    在网上找了一段插入图片的例子试了一下还是有问题。。
       ........//连接数据库
       
        .......//得到记录集,确定记录集中有数据
      /*然后准备图片数据*/   
      VARIANT   vImg;   
      char   *pBuff,*pBuffFile;   
      //...   
      /*从文件读BMP图像*/   
      CFile   f;   
      DWORD   dwSize;   
      if(f.Open("c:\\maoshi.gif",CFile::modeRead   |CFile::modeNoTruncate   )   &&   (dwSize=f.GetLength   ())>10)//打开文件   
      {   
    pBuffFile=new   char[dwSize];   
    f.Read   (pBuffFile,dwSize);//读出来   
    VariantInit(&vImg);//初始化变量   
    vImg.vt   =VT_ARRAY   |   VT_UI1;//设置数据类型   
    SAFEARRAYBOUND   rgsabound[1];//创建SAFEARRAY必须的   
    rgsabound[0].lLbound   =   0;   
    rgsabound[0].cElements   =   dwSize;//数据大小   
    vImg.parray     =   SafeArrayCreate(VT_UI1,   1,   rgsabound);       ///创建SAFEARRAY对象   
    SafeArrayAccessData(vImg.parray,(void   **)&pBuff);//获取SAFEARRAY的缓冲区指针   
    memcpy(pBuff,pBuffFile,dwSize);//把图片数据COPY进去   
    ::SafeArrayUnaccessData   (vImg.parray   );//释放SAFEARRAY的缓冲区指针   
      //到这里已经把图片封装进了vImg了   
      //然后把vImg存到数据库里面去   
      //pRst->->MoveLast   ();//根据定需要定位记录   
      pRst->GetFields()->GetItem("IMG_ITEM")->AppendChunk(vImg);//把vImg放到recordset的IMG_字段,这个字段是SQLSERVER的IMAGE数据类型   
      pRst->Update   ();//更新   
      pRst->Close   ();//关闭Recordset  
      }
    pRst->GetFields()->GetItem("IMG_ITEM")->AppendChunk(vImg);//总是运行到这里的时候出RUNTIME ERROR错误IMG_ITEM字段类型为image是不是要安装什么东西才能存储还是其他的问题啊~~
      

  12.   

    你把sql语句等放到数据库查询分析器中执行,看能否正确执行,先排除sql语句没有问题,我上面帖子提的,你改了试了没
      

  13.   


    用INSERT pBuffer这个方法插入应该是不行了、因为SQL语句长度好像有限制~
      

  14.   

    TO:oyljerry 帮我想想办法吧,这个问题搞了我两天了,头都快炸了
    VC/MFC->数据库  那我也发了一个100分的帖,只是拿里人气少
    所以又发到这里来了~~其实我最终的目的就是 
       实现把EXCEL或WORD保存到SQL里,然后反向能读取出EXCEL或WORD随便什么方法都行只要能实现这个功能
      

  15.   

    应该直接用BLOB大字段类型存储吧,看看下面的是否有用:
    ADO
    http://www.vckbase.com/document/viewdoc/?id=252
      

  16.   

    非常感谢各位的帮助,问题已经解决方法是:laiyiling提供的实例结贴给分!