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

Discussion in 'QDAC' started by swish, Nov 12, 2015.

  1. swish

    swish Staff Member Moderater

    Apr 13, 2015
    转载自QDAC官网网站,文章发现问题可能随时更新,最新版本请访问:[QDB] 使用 TQConverter 直接将数据流从一种格式转换为另一种格式
    TQConverter 新增了SaveToConverter / LoadFromConverter 方法来简化数据流格式的转换,支持从流中和文件中转换数据格式后保存到另一个流或文件中。
    下面的示例代码演示了:
    1. 将当前 FDataSet 数据集的内容使用 TQBinaryConverter 来保存到 ASourceStream 中( QDB 原生的二进制格式 )。
    2. 将 ASourceStream 的内容,通过调用 TBinaryConverter .SaveToConverter 方法,通过 TQMSSQLConverter 转换器,保存到 SQL 脚本数据流 ATargetStream 中。
    3. 将 ATargetStream 中的数据流通过 LoadTextW 函数加载并显示到 Memo1 中,呈现给用户。
    Code (Text):
    1. var
    2.   ASource, ADest: TQConverter;
    3.   ASourceStream,ADestStream: TStream;
    4.   I: Integer;
    5. begin
    6.   //创建转换器和流对象
    7.   ASource := TQBinaryConverter.Create(nil);
    8.   ADest := TQMSSQLConverter.Create(nil);
    9.   TQMSSQLConverter(ADest).AllAsInsert := True;
    10.   ASourceStream := TMemoryStream.Create;
    11.   ADestStream:=TMemoryStream.Create;
    12.   try
    13.     //保存源数据到流中,做为测试转换格式的数据一个来源,实际使用时源应该是一个已存在的文件或流
    14.     ASource.SaveToStream(FDataSet, ASourceStream);
    15.     ASourceStream.Position := 0;
    16.     //使用 ASource.SaveToConverter 或 ADest.LoadFromConverter 来完成格式转换
    17.     ASource.SaveToConverter(ADest,ASourceStream,ADestStream);
    18.     //将转换生成的SQL加载到Memo里显示    
    19.     ADestStream.Position:=0;
    20.     Memo1.Lines.Text := LoadTextW(ADestStream);
    21.   finally
    22.     FreeAndNil(ASource);
    23.     FreeAndNil(ADest);
    24.     FreeAndNil(ASourceStream);
    25.     FreeAndNil(ADestStream);
    26.   end;
    上面的代码,实际上除去准备流数据和显示那块,只用了一句话
    就完成了格式的转换。当然,如果你想直接转换到文件,简单的将上面的流换成文件名即可。我们来详细了解下 TQConverter 的 LoadFromConverter 和 SaveToConverter 方法。
    Code (Text):
    1. procedureLoadFromConverter(AConverter:TQConverter;ASourceStream,ATargetStream:TStream);overload;
    2. procedureLoadFromConverter(AConverter:TQConverter;ASourceFile,ATargetFile:QStringW);overload;
    3. procedureLoadFromConverter(AConverter:TQConverterClass;SourceStream,ATargetStream:TStream);overload;
    4. procedureLoadFromConverter(AConverter:TQConverterClass;ASourceFile,ATargetFile:QStringW);overload;
    5.  
    6. procedureSaveToConverter(AConverter:TQConverter;ASourceStream,ATargetStream:TStream);overload;
    7. procedureSaveToConverter(AConverter:TQConverter;ASourceFile,ATargetFile:QStringW);overload;
    8. procedureSaveToConverter(AConverter:TQConverterClass;ASourceStream,ATargetStream:TStream);overload;
    9. 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: Nov 29, 2016