⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 用vc存取数据库中的大对象.htm

📁 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",&amp;&amp;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 + -