📄 用vc存取数据库中的大对象.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存取数据库中的大对象</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存取数据库中的大对象</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++编写应用程序时,常会遇到如何存取数据库中大对象的问题。大对象文档以二进制数据形式保存在BLOB类型的字段中,这些大对象可能是Word、Execl或图片文件等,目前多数数据库都支持BLOB类型的字段。<BR><BR> VC存取这些大对象数据有众多方法,如OLE、ActiveX等,事实上VC的MFC提供了一个很方便的实现方法,即利用MFC提供的CLongBinary类可以方便地实现存取BLOB字段。下面笔者将举例说明。<BR><BR> 首先用以下SQL语句建一个含BLOB字段的数据表:<BR><BR> <BR><BR> CREATE
TABLE REPORTTABLE(REGISTERNUM CHAR(12) NOT NULL,REPORT BLOB(5M),PRIMARY
KEY(REGISTERNUM));<BR><BR> <BR><BR> 建完该表后,配置好ODBC数据源,设定数据源名为ABCDB。<BR><BR> 我们用VC的MFC
AppWizard建一个新的Project,设定项目名为ABC,下一步选Single Document,在提示你想包含什么样的数据库支持时,选Header
files
only,然后完成建立。<BR><BR> 接着在Resources的Dailog资源中新建一个FormView,打开该FormView,启用ClassWizard,建立一个新类,设定类名叫CReportRecordSet,Base
Class选CRecordSet,然后选ABCDB为数据源,再选择表REPORTTABLE,启动ClassWizrd,并建立新类CReportFormView,Base
Class为CRecordView,选Recordset时,选CReportRecordSet。<BR><BR> 打开ReportRecordSet.h,找到该行:CString
m_REPORT; 改为CLongBinary
m_REPORT;这样程序就知道m_REPORT是和BLOB字段交换数据。同样,我们还需要修改另外几处,打开ReportRecordSet.cpp后,删除m_REPORT
= _T("");一句。再找到RFX_Text(pFX, _T("[REPORT]"),
m_REPORT);一句,将其改为RFX_LongBinary(pFX, _T("[REPORT]"), m_REPORT);
ODBC方法存取数据库时使用RFX_LongBinary;DAO方法则用DFX_LongBinary。<BR><BR> 再次打开FormView,添加一个Edit控件,并用ClassWizard将它和member
variable m_pSet-〉m_
REGISTERNUM关联,然后在FormView上增加三个按键,Caption名分别叫“取得Word文档”、“更新word文档”、“新增word文档”。并分别为这三个按键建立各自的Function,然后我们为这三个按键增加相应的代码。在按键“取得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 函数<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函数删除该临时文件<BR><BR> }<BR><BR> CString
strFileName="e:\\qc\\abc\\tyj.doc";<BR><BR> CFile
outFile(strFileName,CFile::modeCreate|CFile::modeWrite);<BR><BR> //modeCreate指示构造函数创建一个新文件<BR><BR> //下面这段把已经在内存中的BLOB字段数据内容写到临时生成的文件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> //下面执行外部程序,Word会自动启动并打开tyj.doc}
}<BR><BR> catch(CException
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -