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

  • 相关阅读:
    Simple Automated Backups for MongoDB Replica Sets
    [转] matlab获取时间日期
    Matlab与C++混合编程 编写独立外部应用程序时出现“无法定位序数3906于动态链接库LIBEAY32.dll上”错误
    Visual Studio 控制台应用程序 同时使用OpenCV和matlab mat文件操作
    [转] Matlab与C++混合编程(依赖OpenCV)
    OpenCV 64位时 应用程序无法正常启动0x000007b 问题解决
    LinkedBlockingQueue多线程测试
    rdlc报告vs2008编辑正常,在vs2012在对错误的编辑
    SD3.0四个协议解读
    链队列
  • 原文地址:https://www.cnblogs.com/jiangyuxuan/p/1531952.html
Copyright © 2020-2023  润新知