TClientDataSet将二进制字段读取到TStream

时间:2014-05-06 17:19:23

标签: sql-server delphi delphi-xe3 dbexpress tclientdataset

我已经尽可能地尝试了这一切,但似乎无法解决这个问题。我正在使用Delphi XE3中的DBExress编写REST DataSnap服务器。

我将数据存储在二进制(384)字段中的MSQL中,而Binary就像我所知的那样与BLOB / Image字段相同,因为它是所有二进制数据。

尝试将此数据传输到TStream时,我收到异常错误,并尝试了以下

var
STemplate : TStream;
begin
......
Template := TBlobField.Create(cdsBSUserTemplates.FieldByName('bTemplate'));
TBlobField(cdsBSUserTemplates.FieldByName('bTemplate')).SaveToStream(STemplate); //exception
......
end;

我试过

var
STemplate : TStream;
begin
......
Template := TBlobField.Create(cdsBSUserTemplates.FieldByName('bTemplate'));
STemplate := cdsBSUserTemplates.CreateBlobStream(Template, bmRead); //exception
......
end;

我可以返回值.AsString,但它是Bytes,然后我需要尝试修复我从该字段读取的内容。

知道我还能尝试什么吗?

1 个答案:

答案 0 :(得分:1)

你的工作太辛苦了。 : - )

您需要正确创建流,然后让该字段写入。

var
  Output: TMemoryStream;
  Fld: TBlobField;
begin
  // Use of variable makes it more readable
  Fld := cdsBSUserTemplates.FieldByName('bTemplate') as TBlobField;

  Output := TMemoryStream.Create;
  try
    Fld.SaveToStream(Output);
    Output.Position := 0;
    // Do whatever with the output stream
  finally
    Output.Free;
  end;
end;

在你发表评论之后,你可能没有使用TBlobField(在我发布答案之前我会很高兴知道),你可以试试这个(未经测试,因为我显然没有你的数据):

var
  Output: TMemoryStream;
  Fld: TField;
  Bytes: TArray<Byte>;
begin
  Fld := ADOQuery1.FieldByName('bTemplate');
  Output := TMemoryStream.Create;
  try
    if Fld.IsBlob then
      TBlobField(Fld).SaveToStream(Output)
    else
    begin
      Fld.GetData(Bytes);
      Output.WriteData(Bytes, Length(Bytes));
    end;
    // Do whatever with output
  finally
    Output.Free;
  end;
end;