我要将一个ADO数据集的所有记录内容暂时保存在流中

解决方案 »

  1.   

    就我所知只有 SaveToFile , 不知還有沒有更好的方法
      

  2.   

    我也知道有savetofile.但不知道savetofile 能不能在不先保在到文件.直接在内容中转换到流中
      

  3.   

    savetofile 可以存为XML文件。
    流操作可参看:转贴://写入 
    var
     MS: TFileStream;
    begin
     if OpenDialog1.Execute then
     begin
      MS:=TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
       MS.Position:=0;
       Table1.Append; 
      //在数据库中添加一条记录
       TBlobField(Table1.FieldbyName(’FieldDoc’)).LoadFromStream(MS);
       Table1.Post; 
      MS.Free;
     end;
    end; 
    //  读取
    var
      FileSource ,FileDest : Tfilestream;
      fileStrd,FileStrs:string;
      F:File;
    begin
     with Table1 do
      FileSource:=CreateBlobStream(FieldbyName(’ fieldDoc’),bmRead);
      try
       if savedialog1.Execute then
      begin
         filestrd := savedialog1.FileName;
      end;
       if not FileExists(Filestrd) then//如不存在新建
       begin
       assignFile(F,Filestrd);
       Rewrite(f);
       CloseFile(F);
       end;   fileDest := TFileStream.Create(FileStrD,fmOpenWrite or fmShareDenyRead);
       try
       FileDest.CopyFrom(FileSource,FileSource.Size);
          finally
          FreeAndNil(FileDest);
          end;
        finally
        FreeAndNil(FileSource);               //释放文件流
        end;end;
      

  4.   

    楼主想将数据集内容保存到流的主要目的是什么?是否只是想做一个数据中转的功能,其实保存成文件也未尝不可(pfADTG的操作效率要比xml高)
      

  5.   

    不是,我的目的是因为,ADO的事务有一个bug,我需要先将数据保存起来,以复原.我原来用数组来保存.后来,觉得不好.想改成流来缓存
      

  6.   

    var
      FileStream: TFileStream;
      st:TStringStream;
      Fname:string;        Fname:=extractfiledir(application.ExeName)+'\temp\'+FieldByName('FileName').AsString;
            FileStream := TFileStream.Create(fname,fmCreate or fmOpenWrite);
            FileStream.Position:=0;
            tblobfield(fieldbyname('FileContent')).SaveToStream(filestream);
            FileStream.Free;
      

  7.   

    楼主想将数据集内容保存到流的主要目的是什么?是否只是想做一个数据中转的功能,其实保存成文件也未尝不可(pfADTG的操作效率要比xml高)
      

  8.   

    我后来,发现使用原生ADO2.5以上可能使用流来保存.但是,还存在一个问题.
      

  9.   

    用ClientDataSet来保存,不必用流,这样保存后还可以当作表操作,
      

  10.   

    其实做法很简单的,不必去用复杂的流操作。直接写一个过程,将数据集中的数据全部写成sql语句是最后的,因为ado的提交很多时候会出错,而不能保存数据,你只要先用ado的保存数据来做,然后try一下,如果出错,就把数据翻译成sql语句执行,如果还是出错,可以把所有的sql语句保存,然后下次进入时再执行掉就可以了,这样可以最大限度的保证所输入的数据不被丢掉。