TQConverter 新增了SaveToConverter / LoadFromConverter 方法来简化数据流格式的转换,支持从流中和文件中转换数据格式后保存到另一个流或文件中。
下面的示例代码演示了:
- 将当前 FDataSet 数据集的内容使用 TQBinaryConverter 来保存到 ASourceStream 中( QDB 原生的二进制格式 )。
- 将 ASourceStream 的内容,通过调用 TBinaryConverter .SaveToConverter 方法,通过 TQMSSQLConverter 转换器,保存到 SQL 脚本数据流 ATargetStream 中。
- 将 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 : 目标数据流或文件名。文件时,如果目标文件不存在,会自动创建,如果存在,会自动覆盖,提示是否覆盖是上层调用者的责任。
好了,结果出来了: