龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

用VC存取数据库中的大对象(2)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
CString strFileName="e:qcabctyj.doc"; CFile outFile(strFileName,CFile::modeCreate|CFile::modeWrite); //modeCreate指示构造函数创建一个新文件 //下面这段把已经在内存中的BLOB字段数
                  CString strFileName="e:qcabctyj.doc";
                  CFile outFile(strFileName,CFile::modeCreate|CFile::modeWrite);
                  //modeCreate指示构造函数创建一个新文件

                  //下面这段把已经在内存中的BLOB字段数据内容写到临时生成的文件tyj.doc中
                  LPSTR buffer = (LPSTR)GlobalLock(m_pSet-〉m_REPORT.m_hData);
                  outFile.WriteHuge(buffer,m_pSet-〉m_REPORT.m_dwDataLength);
                  GlobalUnlock(m_pSet-〉m_REPORT.m_hData);
                  outFile.Close();
                  ShellExecute(NULL,NULL,_T("tyj.doc"),NULL,_T("e:qcabc"),NULL);
                  //下面执行外部程序,Word会自动启动并打开tyj.doc
            }
       }

   catch(CException?pE)
      {
            pE-〉ReportError();
            pE-〉Delete();
            return;
      }

  在按键“更新word文档”的Function中加入以下程序代码:

  m_pSet-〉Edit(); // 声明编辑当前记录
      UpdateData(TRUE);
      CFile fileword;
      CFileStatus fileStatus;
      CString fileLocate;
      static char BASED_CODE szFilter[] = "WORD Files (?.doc)|?.doc||";

      // 下面将弹出典型的打开文件对话框,您可以选择任何目录下的?.doc文件
      CFileDialog dlg(TRUE,NULL,NULL,0,szFilter,this);
      if(dlg.DoModal()= =IDOK)
            fileLocate=dlg.GetPathName();
      else
            fileLocate="";
      if(fileLocate= ="")
            AfxMessageBox("您没选文件");
      else
      {
            fileword.Open(fileLocate,CFile::modeRead);
            fileword.GetStatus(fileStatus);
            m_pSet-〉m_REPORT.m_dwDataLength=fileStatus.m_size;
            HGLOBAL hGlobal = GlobalAlloc(GPTR,fileStatus.m_size);
            m_pSet-〉m_REPORT.m_hData = GlobalLock(hGlobal);
            fileword.ReadHuge(m_pSet-〉m_REPORT.m_hData,fileStatus.m_size);

            //把您选择的文件的数据写入m_pSet-〉m_REPORT
            m_pSet-〉SetFieldDirty(&&m_pSet-〉m_REPORT);
            m_pSet-〉SetFieldNull(&&m_pSet-〉m_REPORT,FALSE);
            m_pSet-〉Update(); // 更新记录
            GlobalUnlock(hGlobal);
      }

  上述代码只要稍做修改,即可把Execl等各类文件存入数据库中。对应按键“新增word文档”只需要复制“更新Word文档”中的代码,并把m_pSet-〉Edit();换成m_pSet-〉AddNew();即可。完成上述步骤后,打开abc.cpp,把RUNTIME_CLASS(CAbcView));这句换成RUNTIME_CLASS(CReportFormView)); 这样程序启动时就显示了该FormView。

  以上所有代码均在IBM UDB6、Visual C++ 6.0、Windows 98环境下编译通过。

精彩图集

赞助商链接