我在使用 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/