[QDB] 使用 TQConverter 直接将数据流从一种格式转换为另一种格式

TQConverter 新增了SaveToConverter / LoadFromConverter 方法来简化数据流格式的转换,支持从流中和文件中转换数据格式后保存到另一个流或文件中。

下面的示例代码演示了:

  1. 将当前 FDataSet 数据集的内容使用 TQBinaryConverter 来保存到 ASourceStream 中( QDB 原生的二进制格式 )。
  2. 将 ASourceStream 的内容,通过调用 TBinaryConverter .SaveToConverter 方法,通过 TQMSSQLConverter 转换器,保存到 SQL 脚本数据流  ATargetStream 中。
  3. 将  ATargetStream 中的数据流通过 LoadTextW 函数加载并显示到 Memo1 中,呈现给用户。
var
  ASource, ADest: TQConverter;
  ASourceStream,ADestStream: TStream;
  I: Integer;
begin
  //创建转换器和流对象
  ASource := TQBinaryConverter.Create(nil);
  ADest := TQMSSQLConverter.Create(nil);
  TQMSSQLConverter(ADest).AllAsInsert := True;
  ASourceStream := TMemoryStream.Create;
  ADestStream:=TMemoryStream.Create;
  try
    //保存源数据到流中,做为测试转换格式的数据一个来源,实际使用时源应该是一个已存在的文件或流
    ASource.SaveToStream(FDataSet, ASourceStream);
    ASourceStream.Position := 0;
    //使用 ASource.SaveToConverter 或 ADest.LoadFromConverter 来完成格式转换
    ASource.SaveToConverter(ADest,ASourceStream,ADestStream);
    //将转换生成的SQL加载到Memo里显示     
    ADestStream.Position:=0;
    Memo1.Lines.Text := LoadTextW(ADestStream);
  finally
    FreeAndNil(ASource);
    FreeAndNil(ADest);
    FreeAndNil(ASourceStream);
    FreeAndNil(ADestStream);
  end;

上面的代码,实际上除去准备流数据和显示那块,只用了一句话

ASource.SaveToConverter(ADest,ASourceStream,ADestStream);

就完成了格式的转换。当然,如果你想直接转换到文件,简单的将上面的流换成文件名即可。我们来详细了解下 TQConverter 的 LoadFromConverter 和 SaveToConverter 方法。

procedure LoadFromConverter(AConverter: TQConverter;ASourceStream, ATargetStream: TStream); overload;
procedure LoadFromConverter(AConverter: TQConverter;ASourceFile, ATargetFile: QStringW); overload;
procedure LoadFromConverter(AConverter: TQConverterClass;SourceStream, ATargetStream: TStream); overload;
procedure LoadFromConverter(AConverter: TQConverterClass;ASourceFile, ATargetFile: QStringW); overload;

procedure SaveToConverter(AConverter: TQConverter;ASourceStream, ATargetStream: TStream); overload;
procedure SaveToConverter(AConverter: TQConverter;ASourceFile, ATargetFile: QStringW); overload;
procedure SaveToConverter(AConverter: TQConverterClass;ASourceStream, ATargetStream: TStream); overload;
procedure SaveToConverter(AConverter: TQConverterClass;ASourceFile, ATargetFile: QStringW); overload;

实际上,两个函数我们可以认为它是逆运算 ConverterA.LoadFromConverter(ConverterB) 等价于 ConverterB.SaveToConverter(ConverterA),内部的实现实际最终也指向了同一个函数,封装成不同的接口是为了提高代码的可读性和易用性。咱们对函数的声明以 SaveToConverter 来说明:

  • AConverter : 一个转换器实例或类型。区别在于如果使用转换器实例,则你可以预先调节转换器的参数,从而控制输出到目标数据流中的数据内容、格式、进度等等,而使用类型的话,你只能采用默认参数了(这不废话嘛~~~)
  • ASourceStream/ASourceFile : 源数据流或文件名。源数据流或文件内容必需是源转换器的格式,而不是目标转换器的格式。
  • ATargetStream/ATargetFile : 目标数据流或文件名。文件时,如果目标文件不存在,会自动创建,如果存在,会自动覆盖,提示是否覆盖是上层调用者的责任。

好了,结果出来了:

directconverter

 

 

分享到: