QDB 使用 TQConverter 一句话转换数据格式

swish

Moderater
Staff member
Moderater
#1
转载自QDAC官网网站,文章发现问题可能随时更新,最新版本请访问:[QDB] 使用 TQConverter 直接将数据流从一种格式转换为另一种格式
TQConverter 新增了SaveToConverter / LoadFromConverter 方法来简化数据流格式的转换,支持从流中和文件中转换数据格式后保存到另一个流或文件中。
下面的示例代码演示了:
  1. 将当前 FDataSet 数据集的内容使用 TQBinaryConverter 来保存到 ASourceStream 中( QDB 原生的二进制格式 )。
  2. 将 ASourceStream 的内容,通过调用 TBinaryConverter .SaveToConverter 方法,通过 TQMSSQLConverter 转换器,保存到 SQL 脚本数据流 ATargetStream 中。
  3. 将 ATargetStream 中的数据流通过 LoadTextW 函数加载并显示到 Memo1 中,呈现给用户。
Code:
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 方法。
Code:
procedureLoadFromConverter(AConverter:TQConverter;ASourceStream,ATargetStream:TStream);overload;
procedureLoadFromConverter(AConverter:TQConverter;ASourceFile,ATargetFile:QStringW);overload;
procedureLoadFromConverter(AConverter:TQConverterClass;SourceStream,ATargetStream:TStream);overload;
procedureLoadFromConverter(AConverter:TQConverterClass;ASourceFile,ATargetFile:QStringW);overload;

procedureSaveToConverter(AConverter:TQConverter;ASourceStream,ATargetStream:TStream);overload;
procedureSaveToConverter(AConverter:TQConverter;ASourceFile,ATargetFile:QStringW);overload;
procedureSaveToConverter(AConverter:TQConverterClass;ASourceStream,ATargetStream:TStream);overload;
procedureSaveToConverter(AConverter:TQConverterClass;ASourceFile,ATargetFile:QStringW);overload;
实际上,两个函数我们可以认为它是逆运算 ConverterA.LoadFromConverter(ConverterB) 等价于 ConverterB.SaveToConverter(ConverterA),内部的实现实际最终也指向了同一个函数,封装成不同的接口是为了提高代码的可读性和易用性。咱们对函数的声明以 SaveToConverter 来说明:
  • AConverter : 一个转换器实例或类型。区别在于如果使用转换器实例,则你可以预先调节转换器的参数,从而控制输出到目标数据流中的数据内容、格式、进度等等,而使用类型的话,你只能采用默认参数了(这不废话嘛~~~)
  • ASourceStream/ASourceFile : 源数据流或文件名。源数据流或文件内容必需是源转换器的格式,而不是目标转换器的格式。
  • ATargetStream/ATargetFile : 目标数据流或文件名。文件时,如果目标文件不存在,会自动创建,如果存在,会自动覆盖,提示是否覆盖是上层调用者的责任。
好了,结果出来了:

oizKqfc-ED8WR1412Pf3-EHg_dR6olbZ.jpeg
 
Last edited by a moderator: