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

标签 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 错误 #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;

谁能告诉我如何解决这个问题。 谢谢。

最佳答案

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

如果显示了一些图像,但不是全部,那么最可能的解释是数据没有以某种方式往返于数据库和返回。

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

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

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

关于mysql - 当 JPEG 存储在数据库中时,为什么会出现错误 42?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12697699/

相关文章:

delphi - Windows Message lparam转换

Delphi本地网络应用程序

mysql - rand () - 获取每个 id 的 10 个 rand 值的结果

mysql - 如何根据表中选择的百分比将行值分配给不同的值

delphi - 如何在 FireMonkey FM2 中使用多个窗口

delphi - 为什么 CharInSet 比 Case 语句更快?

delphi - 我的应用程序的自动更新实用程序正在触发防病毒

MySQL多列复合主键

mysql - 在 MySQL 中查找最近的纬度经度点查询不起作用

delphi - 在 WebBrowser 控件上禁用 Ctrl+P(打印)