我已经尽可能地尝试了这一切,但似乎无法解决这个问题。我正在使用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,然后我需要尝试修复我从该字段读取的内容。
知道我还能尝试什么吗?
答案 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;