?? 用vc存取數(shù)據(jù)庫中的大對象.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0036)http://www.vchome.net/tech/vc144.htm -->
<HTML><HEAD><TITLE>用VC存取數(shù)據(jù)庫中的大對象</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff>
<H2 align=left><FONT color=#0000ff size=2>[<A
href="http://www.vchome.net/tech/vclist1.htm"
tppabs="http://person.zj.cninfo.net/~yhaiyan/technology/vc/vclist1.htm">返回</A>]<BR></FONT><FONT
color=#800000 size=2>中國計算機報2000年第80期</FONT></H2>
<H2 align=center><FONT face=宋體 color=#008080
size=3><STRONG>用VC存取數(shù)據(jù)庫中的大對象</STRONG></FONT></H2>
<P align=right><FONT color=#008080 size=3><EM>唐一均</EM></FONT></P><FONT face=宋體
color=#0000ff size=2> </FONT><FONT face=宋體 color=#0000ff size=2>在用Visual
C++編寫應(yīng)用程序時,常會遇到如何存取數(shù)據(jù)庫中大對象的問題。大對象文檔以二進制數(shù)據(jù)形式保存在BLOB類型的字段中,這些大對象可能是Word、Execl或圖片文件等,目前多數(shù)數(shù)據(jù)庫都支持BLOB類型的字段。<BR><BR> VC存取這些大對象數(shù)據(jù)有眾多方法,如OLE、ActiveX等,事實上VC的MFC提供了一個很方便的實現(xiàn)方法,即利用MFC提供的CLongBinary類可以方便地實現(xiàn)存取BLOB字段。下面筆者將舉例說明。<BR><BR> 首先用以下SQL語句建一個含BLOB字段的數(shù)據(jù)表:<BR><BR> <BR><BR> CREATE
TABLE REPORTTABLE(REGISTERNUM CHAR(12) NOT NULL,REPORT BLOB(5M),PRIMARY
KEY(REGISTERNUM));<BR><BR> <BR><BR> 建完該表后,配置好ODBC數(shù)據(jù)源,設(shè)定數(shù)據(jù)源名為ABCDB。<BR><BR> 我們用VC的MFC
AppWizard建一個新的Project,設(shè)定項目名為ABC,下一步選Single Document,在提示你想包含什么樣的數(shù)據(jù)庫支持時,選Header
files
only,然后完成建立。<BR><BR> 接著在Resources的Dailog資源中新建一個FormView,打開該FormView,啟用ClassWizard,建立一個新類,設(shè)定類名叫CReportRecordSet,Base
Class選CRecordSet,然后選ABCDB為數(shù)據(jù)源,再選擇表REPORTTABLE,啟動ClassWizrd,并建立新類CReportFormView,Base
Class為CRecordView,選Recordset時,選CReportRecordSet。<BR><BR> 打開ReportRecordSet.h,找到該行:CString
m_REPORT; 改為CLongBinary
m_REPORT;這樣程序就知道m(xù)_REPORT是和BLOB字段交換數(shù)據(jù)。同樣,我們還需要修改另外幾處,打開ReportRecordSet.cpp后,刪除m_REPORT
= _T("");一句。再找到RFX_Text(pFX, _T("[REPORT]"),
m_REPORT);一句,將其改為RFX_LongBinary(pFX, _T("[REPORT]"), m_REPORT);
ODBC方法存取數(shù)據(jù)庫時使用RFX_LongBinary;DAO方法則用DFX_LongBinary。<BR><BR> 再次打開FormView,添加一個Edit控件,并用ClassWizard將它和member
variable m_pSet-〉m_
REGISTERNUM關(guān)聯(lián),然后在FormView上增加三個按鍵,Caption名分別叫“取得Word文檔”、“更新word文檔”、“新增word文檔”。并分別為這三個按鍵建立各自的Function,然后我們?yōu)檫@三個按鍵增加相應(yīng)的代碼。在按鍵“取得Word文檔”的Function中加入如下代碼:<BR><BR> try
//該程序的所在當前目錄是e:\qc\abc\<BR><BR> { if
(m_pSet-〉IsEOF())<BR><BR> AfxMessageBox("沒有該小組的成果報告");<BR><BR> else
{//下面檢測臨時文件tyj.doc是否存在<BR><BR> HANDLE hFind;<BR><BR> WIN32_FIND_DATA findData
=
{0};<BR><BR> hFind=FindFirstFile("e:\\qc\\abc\\tyj.doc",&&findData);<BR><BR> //
FindFirstFile是Windows API 函數(shù)<BR><BR> if(hFind = =
INVALID_HANDLE_VALUE)<BR><BR> AfxMessageBox("不存在臨時文件");<BR><BR> else<BR><BR> {AfxMessageBox("有臨時文件");<BR><BR> DeleteFile("e:\\qc\\abc\\tyj.doc");<BR><BR> //利用API函數(shù)刪除該臨時文件<BR><BR> }<BR><BR> CString
strFileName="e:\\qc\\abc\\tyj.doc";<BR><BR> CFile
outFile(strFileName,CFile::modeCreate|CFile::modeWrite);<BR><BR> //modeCreate指示構(gòu)造函數(shù)創(chuàng)建一個新文件<BR><BR> //下面這段把已經(jīng)在內(nèi)存中的BLOB字段數(shù)據(jù)內(nèi)容寫到臨時生成的文件tyj.doc中<BR><BR> LPSTR
buffer =
(LPSTR)GlobalLock(m_pSet-〉m_REPORT.m_hData);<BR><BR> outFile.WriteHuge(buffer,m_pSet-〉m_REPORT.m_dwDataLength);<BR><BR> GlobalUnlock(m_pSet-〉m_REPORT.m_hData);<BR><BR> outFile.Close();<BR><BR> ShellExecute(NULL,NULL,_T("tyj.doc"),NULL,_T("e:\\qc\\abc\\"),NULL);<BR><BR> //下面執(zhí)行外部程序,Word會自動啟動并打開tyj.doc}
}<BR><BR> catch(CException
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -