为什么当它存储在数据库中时会出现JPEG错误42?

时间:2012-10-02 20:23:16

标签: mysql delphi delphi-7 jpeg

我有问题使用Delphi从我的MySql数据库在TImage中显示我的图片。

我使用此代码将图片保存到我的数据库并完美地工作。

var
  AStream : TMemoryStream;

AStream := TMemoryStream.Create;
  try
    Image1.Picture.Graphic.SaveToStream(AStream);
    AStream.Position := 0;
    if ADODataSet1.Active then
    begin
      ADODataSet1.Edit;
      TBlobField(ADODataSet1.FieldByName('MyField')).LoadFromStream(AStream);
      ADODataSet1.Post;
    end;
  finally
    AStream.Free;
  end;

但是,问题是当我想要检索那些图片时。我使用此代码,但我只能显示数据库中的第一个图像。我在DBGrid事件上使用此代码 - OnDrawColumnCell。当我使用这个代码时,我正在收到JPEG#ERROR#42的消息!

var
  AStream : TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  try
    if ADODataSet1.Active then
    begin
      TBlobField(ADODataSet1.FieldByName('MyField')).SaveToStream(AStream);
      AStream.Position := 0;
      Image1.Picture.Graphic.LoadFromStream(AStream);
    end;
  finally
    AStream.Free;
  end;
end;

有人可以告诉我如何解决这个问题。 谢谢。

1 个答案:

答案 0 :(得分:7)

截断流时报告JPEG错误42。例如,如果您尝试将零长度文件加载到TJPEGImage,则错误42是最终结果。

如果显示某些图像,但不是全部图像,则最可能的解释是数据在某种程度上不会使数据包往返并返回。

写出时检查BLOB字段的大小。将其写入磁盘文件时,请检查它是否与文件大小相符。检查磁盘文件是否是有效的JPEG。然后在重新读取时确认BLOB字段具有完全相同的长度。也许你的数据库代码出了问题,流被截断了。

因此,这里的第一步是确认您可以恢复最初放入数据库的完全相同的数据。

我唯一的另一个想法是图像控件中的图形并不总是JPEG。用于加载图像的代码Image1.Picture.Graphic.LoadFromStream()假定数据是JPEG。如果您保存了除JPEG之外的其他内容,则LoadFromStream()将失败。