| DELPHI实现把WORD、EXCEL和图片等存储到数据库中 |
用image字段保存这些文档。 var word_stream: TMemoryStream; filename: string; begin if odgDoc.Execute then//odgDoc:OpenDialog begin filename := ExtractFileName(odgDoc.FileName); word_stream := TMemoryStream.Create; word_stream.LoadFromFile(odgDoc.FileName); word_stream.Position := 0; cdsPACT.Append cdsPACT.FieldByName(’DocName’).Value := filename; TBlobField(cdsPACT.FieldByName(’PactText’)).LoadFromStream(word_stream); cdsPACT.Post; word_stream.Free; end; end;
---- 目前,Delphi被越来越多的人选中作为MIS系统开发中的前台工具。在以Delphi为前台,一些大型数据库为后台的MIS系统中,图形的处理不可避 免;即从以Delphi开发的前台界面输入图形,并保存到相应的数据库字段中。在这种形式的图形处理中,BMP文件的处理比较简单,因为Delphi本身 有Image和DBImage构件,用这些构件与数据库中可以保存图形的大型字段BLOB比较容易地进行数据交换。以这种方式进行图形处理已应用在许多 MIS软件中,包括处理人员照片的人事档案系统等。 ---- 但是,BMP文件一般都比较大。而且有时要录入的是自己在计算机上画的简图,并伴随大量文字说明。这种情况用Win95中的画图板等处理BMP文件的工具 处理就比较困难。一般应用人员都喜欢用WORD画图和写说明文字,然后保存到数据库中。 ---- 经过一段时间的摸索,我们解决了这个问题,并经过完善,在应用中运行较好。程序如下: procedure TsampleForm.OpenDOCClick(Sender: TObject); var MemSize: Integer; Buffer: PChar; Myfile: TFileStream; Stream: TBlobStream; begin OpenDialog1.Filter:=’WORD文档(*.DOC)|*.DOC’;{从对话窗选择文件} if OpenDialog1.Execute then begin Myfile:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead); with table1 do {‘table1’为含BLOB字段的表名} begin Open; Edit; Stream := TBlobStream.Create(FieldByName(’Doc’) as TBlobField, bmWrite);{‘Doc’为BLOB字段名} MemSize := MyFile.Size; Inc(MemSize); {Make room for the buffer’s null terminator.} Buffer := AllocMem(MemSize); {Allocate the memory.} try Stream.Seek(0, soFromBeginning); {Seek 0 bytes from the stream’s end point} MyFile.Read(Buffer^,MemSize); Stream.Write(Buffer^,MemSize); finally MyFile.Free; Stream.Free; end; try Post; except on E: EDatabaseError do if HandelException(E)< >0 then exit else raise; end; end; Doc_ole.CreateObjectFromFile(OpenDialog1.FileName,False); Doc_ole.Run;{Doc_ole为ToleContainer构件名} end; end; ---- 以上为向数据库中写入的程序,应用中从对话窗取出文件在ToleContainer构件中显示的同时存入数据库。 procedure TsampleForm.GetDocClick(Sender: TObject); var MemSize: Integer; Buffer: PChar; Myfile: TFileStream; Stream: TBlobStream; begin Myfile:=TFileStream.Create(’c:\temp.tmp’,fmCreate); with Query1 do begin Stream := TBlobStream.Create(FieldByName(’Doc’) as TBlobField, bmRead); MemSize := Stream.Size; Inc(MemSize); {Make room for the buffer’s null terminator.} Buffer := AllocMem(MemSize); {Allocate the memory.} try Stream.Read(Buffer^,MemSize); MyFile.Write(Buffer^,MemSize); finally MyFile.Free; Stream.Free; end; end; if FileExists(’c:\temp.DOC’) then DeleteFile(’c:\temp.DOC’); if FileExists(’c:\temp.tmp’) then begin RenameFile(’c:\temp.tmp’, ’c:\temp.DOC’); Doc_ole.CreateObjectFromFile(’c:\temp.DOC’,False); Doc_ole.Run; end; end; ---- 以上程序为从数据库从将WORD文档取出,并放在temp.doc的临时文件上并在ToleContainer构件中显示。 ---- 在程序的其他部份应准确控制表记录指针,使WORD文档的存取发生在正确的记录位置。
|
| 上一篇:上一篇文章: delphi twebbrowser构件编程方法详解 下一篇
下一篇文章: 没有了 |
收藏此文到 百度搜藏|
新浪VIvi|
365key|
Younote|
博采中心|
你好BLOG|
亿友网摘|
和讯网摘| |
|
|
|
|