用VC存取数据库中的大对象(2)
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环境下编译通过。