【问题标题】:Delphi stream to/from database with FireDACDelphi 使用 FireDAC 向/从数据库流式传输
【发布时间】:2016-01-14 01:03:16
【问题描述】:

最初我想从使用 SaveToStream/LoadToStream 的 fastreports 保存/检索报告。我使用 RAD Studio XE6(upd1)。

在数据库中,我有索引字段“StVn”类型为 int 和字段“定义”类型为 ntext 的表 Reports。数据库是 MSSQL,用于保存报告:

  FDCommand.CommandText.Text:='UPDATE Reports SET Definition= :pDefinition WHERE StVn=1';
  FDCommand.Params.ParamByName('pDefinition').LoadFromStream(MyStream, ftWidememo);
  FDCommand.Execute;

用于检索:

  FDQuery.SQL.Text:='SELECT * FROM Reports WHERE StVn=1';
  FDQuery.Open();
  MyStream:=FDQuery.CreateBlobStream(FDQuery.FieldByName('Definition'),bmRead);

这适用于一些简短的报告,但对于任何真实的保存/恢复损坏的报告定义。

所以我只用备忘录在新表单上制作了一个测试用例,并尝试使用相同的数据访问设置(FDConnection、FDCommand、FDQuery)和以下代码来保存/恢复它:

procedure TForm1.BMemoSaveClick(Sender: TObject);
var TmpStream:TStream;
begin
  TmpStream:=TMemoryStream.Create;
  Memo1.Lines.SaveToStream(TmpStream);
  ShowMessage(IntToStr(TmpStream.Size));
  FDCommand1.Params.Clear;
  FDCommand1.CommandText.Text:='UPDATE Reports SET Definition= :pDefinition WHERE StVn=1';
  FDCommand1.Params.ParamByName('pDefinition').LoadFromStream(TmpStream,ftWideMemo);
  FDCommand1.Execute();
  TmpStream.Free;
end;

procedure TForm1.BMemoLoadClick(Sender: TObject);
var TmpStream:TStream;
begin
  FDQuery.SQL.Text:='SELECT * FROM Reports WHERE StVn=1';
  FDQuery.Open();
  TmpStream:=FDQuery.CreateBlobStream(FDQuery.FieldByName('Definition'),bmRead);
  ShowMessage(IntToStr(TmpStream.Size));
  Memo1.Lines.LoadFromStream(TmpStream);
  TmpStream.Free;
end;

如您所见,我已插入 ShowMessage 以查看保存和检索时的流大小,如果我只保存默认文本“Memo1”,则保存时的长度为 7,加载备忘录时的长度为 14(总是加倍)。

任何想法我做错了什么?

【问题讨论】:

    标签: sql-server sql-server-2008 delphi blob firedac


    【解决方案1】:

    注意,我没有验证数据库保存/加载,因为我没有 MSSQL,但我很确定这是原因:

    默认情况下,TString 使用默认编码 (TEncoding.Default),这很可能是 ANSI(在我的情况下为 Windows-1252),因此备忘录文本的长度显示为 7 个字节:5 个用于“Memo1”,两个为 CRLF。

    但是,您的列是 NTEXT 类型,它将文本存储为 UTF-16。当你读回它时,你是作为一个 blob 这样做的,FireDAC 不会执行任何字符转换1,因此大小翻了一番。

    我建议您将报告视为二进制数据并使用“图像”类型列将其存储,并使用 ftBlob 而不是 ftWideMemo。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-30
      • 2017-12-13
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多