现在的位置: 首页 > 综合 > 正文

如何用DELPHI实现把WORD、EXCEL和图片等存储到数据库中

2011年09月28日 ⁄ 综合 ⁄ 共 3940字 ⁄ 字号 评论关闭

用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文档的存取发生在正确的记录位置。

 

抱歉!评论已关闭.