我想把一个DOC文件存进数据库,在存之前要把它转成流,请问怎样转啊?

解决方案 »

  1.   

    保存word文档: 
    procedure   Tfrmdyqk1.BitBtn3Click(Sender:   TObject); 
    var     ms:TMemoryStream; 
    begin 
        ms:=   TMemoryStream.create; 
        OleContainer1.SaveToStream   (ms); 
        ms.Position   :=   0;     Query1.close; 
        Query1.sql.clear; 
        Query1.sql.text:= 'select   *     from   oadbo.bw_qwb '; 
        Query1.open; 
        Query1.append; 
        Query1.fieldbyname( 'wjid ').value:=77777777   ; 
        Query1.fieldbyname( 'wjdid ').value:=7; 
        Query1.fieldbyname( 'kzm ').value:= 'txt '; 
        TBlobField(Query1.fieldbyname( 'qw ')).loadfromstream(ms); 
        ms.free; 
        Query1.post; 
        //Query1.applyupdates; 
        Query1.close; 
    end; 
    取出word文档: 
    procedure   Tfrmdyqk1.Button2Click(Sender:   TObject); 
    var     strstream:Tmemorystream; 
                //ls_qw:string; 
    begin         OleContainer1.DestroyObject; 
            strstream   :=   Tmemorystream.Create;         query1.Close; 
            query1.sql.clear; 
            query1.SQL.Add( 'select   qw   from   oadbo.bw_qwb   where   wjid   = '   +   inttostr(77777777)); 
            query1.open   ; 
            query1.First;             
            Tblobfield(query1.fieldbyname( 'qw ')).savetostream(strstream); 
            strstream.position:=0; 
            OleContainer1.loadfromstream(strstream);         strstream.free; 
    end;
      

  2.   


    var
      fStream:TMemoryStream;
    begin
      fStream:=TMemoryStream.Create;
      try
        fStream.LoadFromFile('c:\a.doc');
        fStream.Position:=0;
        qry.Append
        TBlobField(qry.FieldByName('字段名')).LoadFromStream(fStream);
        qry.Post;
      finally
        fStream.Free;
      end;
      

  3.   


    二进制文档就是这个表名。 
    内容是image类型字段   用来保存word文档。   procedure   towordsave(sourcetablename:   string;sourceid:integer;dataset:tadodataset)   ; 
    是一个通用过程,使用方法 
    towordsave( '撰写文章 ',toint(key.text),data.ADODataSet1); 
    '撰写文章 '是指来源, 
    toint(key.text)来源id 
    data.ADODataSet1   数据元 需要在可执行文件目录下有一个empty.DOC文件。 如果二进制文档表的来源和   ID,与   
    towordsave( '撰写文章 ',toint(key.text),data.ADODataSet1); 
    传过来的参数相同,说明已有此文档,则自动打开! 
    你不要机械的用我跟你的带吗?应该理解它的原理! .......................procedure   towordsave(sourcetablename:   string;sourceid:integer;dataset:tadodataset)   ; 
    var 
            sCommandLine:   string; 
            bCreateProcess:   boolean; 
            lpStartupInfo:   TStartupInfo; 
            lpProcessInformation:   TProcessInformation; 
            MemSize:   Integer; 
            Buffer:   PChar; 
            MyFile:   TFileStream; 
            Stream:   TADOBlobStream; 
            RegF:TRegistry; 
    begin 
            RegF:=TRegistry.Create;         //查看.doc文档的打开程序 
            RegF.RootKey:=HKEY_classes_root; 
            try 
                  RegF.OpenKey( 'worddocument\protocol\stdfileediting\server ',True); 
                  sCommandLine:=regf.ReadString( ' ')+ '   '+ExtractFilePath(Application.EXEName)+ 'temp.doc '; 
            except 
            End; 
            RegF.CloseKey; 
            RegF.Free; 
            dataset.Close; 
            dataset.commandtext   := 'select   *   from   二进制文档   where   来源= ' ' '   +sourcetablename+ ' ' '   and   来源id= '+inttostr(sourceid); 
            dataset.open; 
            if   not   dataset.eof   then 
                    begin 
                    MyFile:=TFileStream.Create(ExtractFilePath(Application.EXEName)+ 'temp.tmp ',fmCreate); 
                    Stream:=TADOBlobStream.Create(dataset.FieldByName( '内容 ')   as   TBlobField,   bmRead); 
                    MemSize   :=   Stream.Size; 
                    Inc(MemSize); 
                    Buffer   :=   AllocMem(MemSize); 
                    try 
                            Stream.Read(Buffer^,MemSize); 
                            MyFile.Write(Buffer^,MemSize); 
                    finally 
                            MyFile.Free;Stream.Free; 
                    end; 
                    if   FileExists(ExtractFilePath(Application.EXEName)+ 'temp.DOC ')   then   DeleteFile(ExtractFilePath(Application.EXEName)+ 'temp.DOC '); 
                    if   FileExists(ExtractFilePath(Application.EXEName)+ 'temp.tmp ')   then   RenameFile(ExtractFilePath(Application.EXEName)+ 'temp.tmp ',   ExtractFilePath(Application.EXEName)+ 'temp.DOC '); 
                    end 
            else 
                    begin 
                          if   FileExists(ExtractFilePath(Application.EXEName)+ 'empty.DOC ')   then 
                                    copyfile(pchar(ExtractFilePath(Application.EXEName)+ 'empty.DOC '),pchar(ExtractFilePath(Application.EXEName)+ 'temp.DOC '),false) 
                          else   begin 
                                    ShowMessage( ' < '+ExtractFilePath(Application.EXEName)+ 'empty.DOC> 不存在! '); 
                                    dataset.close   ; 
                                    exit; 
                          end; 
                    end; 
            dataset.close   ; 
            //sCommandLine   := 'C:\Program   Files\Microsoft   Office\Office\winword.exe   '+ExtractFilePath(Application.EXEName)+ 'temp.doc ';         FillChar(lpStartupInfo,   Sizeof(TStartupInfo),   #0); 
            lpStartupInfo.cb   :=   Sizeof(TStartupInfo); 
            lpStartupInfo.dwFlags   :=   STARTF_USESHOWWINDOW; 
            lpStartupInfo.wShowWindow   :=   SW_NORMAL; 
            bCreateProcess   :=   CreateProcess(nil,   PChar(sCommandLine),nil,   nil,   True,   CREATE_NEW_CONSOLE   or   NORMAL_PRIORITY_CLASS,nil,   nil,   lpStartupInfo,   lpProcessInformation); 
            //ShellExecute(zxdcc.Handle, 'save ',pchar(ExtractFilePath(Application.EXEName)+ 'empty.doc ')   , ' ', ' ',SW_SHOWNORMAL);         if   bCreateProcess   then 
            WaitForSingleObject(lpProcessInformation.hProcess,   INFINITE); 
            dataset.Close; 
            dataset.commandtext:= 'select   *   from   二进制文档   where   来源= ' ' '   +sourcetablename+ ' ' '   and   来源id= '+inttostr(sourceid); 
            dataset.open; 
            if   not   dataset.eof   then 
                    dataset.Edit 
            else   begin 
                    dataset.close; 
                    dataset.commandtext:= 'select   *   from   二进制文档 '; 
                    dataset.open; 
                    dataset.append; 
                    end; 
            dataset.FieldValues[ '来源 ']:=sourcetablename; 
            dataset.FieldValues[ '来源id ']:=sourceid; 
            MyFile:=TFileStream.Create(ExtractFilePath(Application.EXEName)+ 'temp.doc ',fmOpenRead); 
            Stream   :=   TADOBlobStream.Create(dataset.FieldByName( '内容 ')   as   TBlobField,   bmWrite);{‘Doc’为BLOB字段名} 
            MemSize   :=   MyFile.Size; 
            Inc(MemSize);//增加的一字节给结尾的null 
            Buffer   :=   AllocMem(MemSize); 
            try 
                    Stream.Seek(0,   soFromBeginning);//流指针位置放到最前 
                    MyFile.Read(Buffer^,MemSize); 
                    Stream.Write(Buffer^,MemSize); 
            finally 
                    MyFile.Free; 
                    Stream.Free; 
            end; 
            dataset.post; 
            dataset.close; 
    end;