【发布时间】: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