BLOB

  • 格式:pdf
  • 大小:170.05 KB
  • 文档页数:3

BLOB数据类型存取方法的研究及应用 

朱春花 张子彪路新春 

(山东大学计算机科学与技术学院济南250061, 

摘 要 本文介绍了BLOB数据类型,就其在VC++开发工具上的存取实现进行了具体的论述,并且对其在其它开发环境(Vi 

Basic,P0-wer B曲)上相关的存取方法进行了介绍和探讨。该方法在诸如医院、公安等领域的计算机系统中具有广泛的应用前景。 

关键词 BLOB数据类型MFC ADOfield对象GetChunk方法AppendChunk方法 

STI Ⅱ oF 1 匝ACCESSING M口Ec.I1EI()DS OF BLOB DATA TYPE 

Zhu Chunhua Zhang Zibiao h Xinchun (Schod of 灯Sden ̄&Technology, Vni, ̄ity,Jinan 250061) 

Aharaet In this paper,the BLOB data type is introduced.Its acce8s and implementation in VC++pI ng environment are JJ]ustzate ̄.And 

 ̄]atod accessing methods in other prD aImnil唱environments(Vis ̄Basic,Power Builder)are also discussed.'l ̄is method has good prospects as it 

has been applied in civil services such as hospitals,police,etc. 

Keywords BLOB data type MFC ADO fieM obi, ̄t GetChunk method AppendChunk method 

1引 言 

目前,人们对于图像数据、大文本数据的存取,需求越来越 

频繁。在很多的实际系统中都要求对这些数据进行存取及处 

理。例如公安部门对居民身份的管理系统,它需要对居民的照 

片及他们的详细信息进行存取、管理,以供对其进行身份验证, 

出入境验证等等。同时对于医院的管理系统来说也同样重要。 在医院中病人的x光片,Cr片都需要存取起来,为远程诊断病 

人提供了重要的依据,同时也为病人病情提供了查询资料。对 这些数据我们可统称为BLOB数据类型,而对这种数据的存取 

方法随着编程语言及数据库的变化而有所不同。因此对BLOB 

数据类型的存取有着很重大的意义。在现在的很多系统中有 

着广泛的应用。在某些系统中已经得到了应用。随着计算机的 广泛使用和发展。它的应用发展前景是广阔的。 

2 BLOB数据类型简介 

在信息处理过程中有一类规模较大而又可分割的数据,如 

较长的备注,详细的说明,数字照片,图像,声音,以及大量测量 

数据等。这些特殊的数据称为大数据块,又称为二进制大对 

象,该类型可以保存的字符串长度在255—65535字节内。实际 

上,在一些数据库系统中并不将其称之为BLOB字段,如Access 

中的OLE对象和备注类型、VFP中的MEMO类型、Oracle中的 

LONG BINARY类型、sybase中的LONG VARCHA ̄、soL Server中 

的I/d_AGE等等,但从广义上讲,它们都属于BLOB类型。我们 

・52・ 可以把B B区别为三种形式:声像数据、二进制数据和大文本 

数据。因此,最常见的应用就是存储图形、声音等对象,此外大 

型的二进制对象、0LE对象也可以通过BLOB类型存人数据库, 

如果文本对象过大,超出了文本类型的规定长度,则必须用 

BLOB字段进行存储。我们在经常使用的编程环境中并不能直 

接支持BLOB字段,因此需要调用相应的函数完成BLOB的使 

用。在此篇文章中就几个编程环境探讨一下BLOB的存取与使 

用,对于VC++给出了具体的例子和代码。 

3 VC抖中的B )B数据的存取 

在用VisuaI C++编写应用程序时,常会遇到如何存取数据 

库中大对象的问题。大对象文档以二进制数据形式保存在 

BLOB类型的字段中,这些大对象可能是Word、Excel或图片文 

件等,目前多数数据库都支持BLOB类型的字段。 

VC++存取这些大对象数据有众多方法,如OLE、AetiveX 

等,事实上VC++的硼}℃提供了一个很方便的实现方法,即利 

用硼陀提供的ClmgB ̄类可以方便地实现存取BLOB字段。 

对此我举例进行说明。 

(1)首先用以下SQL语句建一个含BLOB字段的数据表: 

CREATE TABLE R班DI ̄ITABLE(REGISrⅡiM眦CHAR(12) 

NOT NULL,Ii】 O船BLOB(5M),PRIMARY KEY(REGIS疆噩. NUM)): 

收稿日期-2002—04一Ot。朱春花。硕士生,主研领域:分布式网络 监控。

 维普资讯 http://www.cqvip.com (2)建完该表后,配置好ODBC数据源,设定数据源名为 

ABCDB。 我们用VC++的MFC AppWiza ̄建一个新的Project,设定项 

目名为ABC,下一步选Singledocument,在提示你想包含什么样 

的数据库支持时,选Header files only,然后完成建立。接着在 

Resources的Dialos资源中新建一个FormView,打开该FormView, 

启用ClassWizard,建立一个新类,设定类名叫CReportRecordSet, 

BaseClass选CRecordSet,然后选 B为数据源,再选择表 

REPORTFABLE,启动ClassWizrd,并建立新类CRepoa.FormView, 

Base Class为CRecordView,选Recordset时,选C ̄ordSeto 

(3)打开ReportRecordSet.h,找到该行:CString I11一REPORT; 

改为CtongBinary in—REPORT;这样程序就知道in—REPORT是 

和BLOB字段交换数据。同样,我们还需要修改另外几处,打开 

ReportRecordSet.cpp后,删除in—REPORT=一T( );一句。再找 到RFX—Text(pFX,一T( [REPORT]”),m—REPORT);一句,将其 

改为RFX—tongBinary(pFX,一T(”[REPORT] ),in—REPORT); 

ODBC方法存取数据库时使用RFX—I加gBinary;DAO方法则用 

DFX—tongBinary。 (4)再次打开FormView,添加一个Edit控件,并用ClassWiz. aId将它和member variable in—pset一>in—REGISrERNUM关联, 

然后在FormView上增加三个按键,Caption名分别叫“取得W0柑 

文档”、“更新word文档”、“新增word文档”。并分别为这三个 

按键建立各自的Function,然后我们为这三个按键增加相应的 

代码。 (5)在按键“取得word文档”的Function中加入如下代码: 

CString strFileName= e'-||qc||abc||tyj.doc"; 

CFde outFile(sla'FileNam ̄,CFile::modeCreateI(删e::modeWrite); //monte指示构造函数创建一个新文件 

∥下面这段把已经在内存中的BLOB字段数据内容写到临时生 

成的文件州.doe中 

LPSTR bufer=(I )GlobalLock(nl—pset一)nl—REPORT. 

in—hData}; 

outFile.WriteHuge(bufer,nl—pset一)nl—REPORT.nl—dwData- 

Lel1g【l1); 

GlobalUnlock(m一0set一)m—REPORT.m—hDam); 

outFile.Close(); ShellExecute(NULL,NULL,一T( tyj.doc"),NULL,一T(”e.-\、qc\\ 

abc\\ ),NUt,L); 

∥下面执行外部程序,W0 会自动启动并打开tyj.doe}}..…・ 

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

码: 

in—pset一>Edit();//声明编辑当前记录 

UpdateData(TRUE); 

CFde fileword; 

CFile.%atus f ̄eStatus; 

CStfing fileI_ ̄ate; 

static char BASED—CODE szFdter[]="WORD Files(.doc)I.dot:ll ; ∥下面将弹出典型的打开文件对话框,您可以选择任何目录下 

的.doe文件 

CFileDialog d (1'RI『E,NIa ̄,0,szFiher,this); 

if(dk.DoModal()==IDOK) 

fileLoc ̄te=dk.GetPathName(); else fileIx ̄te= if(flleI_oeate==””、 

AfxMessageBox( 您没选文件 ); 

else{ 

fdeword.Open(fileLocate,CFfle::rnodeRead); 

fileword.GetStatus(fdeStams); 

m#et一}m—REPORT.m—dwDatalength=fileStatus.m—size- 

HG1 0BAL; hGlobal=GlobalAlloc(GPIR,fdeStams.m—size); 

m—pSet一}m—REPORT.m—hData=Globall_ock(hGloba1); 

fileword.ReadHnge(m—pset一)in—REPORT.in—hData,fileStatus.m 

—size); ∥把您选择的文件的数据写入m—pset一}m—REPORT 

m—pset一}SetFieldDirty(&&In—pset一)in—REPORT); 

nl—pset一}SetFieldNutl(&&In—pset一)in—REPORT,FALSE); 

in—pset一}Update();//更新记录 

GlobalUnlock(hGloba1);} 

上述代码只要稍做修改,即可把Excel等各类文件存人数 

据库中。对应按键“新增word文档”只需要复制“更新w0柑文 

档”中的代码,并把in—pset一>Edit();换成in—pset一>AddNew 

();即可。完成上述步骤后,打开abc.epp,把RUNTIME—CLASS 

(CA ̄ ̄iew));这句换成RUNTIME—CLASS(CReportFormView)); 这样程序启动时就显示了该FormView。 

以上所有代码均在IBM L几)B6、Visual C++6.0、Windows 98 

环境下编译通过。 

4 BLOB在其他编程环境中的存取探讨 

由于编程环境很多,本文仅对在PowerBuilder和Visual Basic 

开发环境中对B【』)B数据类型的存取进行比较详细的介绍和研 究。