尝试添加新记录时获取JPEG错误#42

时间:2017-01-02 16:57:16

标签: delphi-2010

我已经想出了如何在我的数据库中存储和检索JPEG文件。如果JPEG文件在那里,我可以轻松编辑它,但如果我尝试输入新记录,我总是得到JPEG错误#42。这是我的代码片段。我使用btnLabelGetClick将图像上传到要发布的流。

procedure TfrmWines.AutoSetDataChange(Sender: TObject; Field: TField);
var
  JPG: TJPEGImage;
  ms: TMemoryStream;
begin
  JPG := TJPEGImage.Create;
  ms := TMemoryStream.Create;
  try
    TBlobField(wdatamod.mywines.FieldByName('winelabel')).SaveToStream(ms);
    ms.Position := 0;
    JPG.LoadFromStream(ms);
    Image1.Picture.Assign(JPG);
  finally
    JPG.Free;
    ms.Free;
  end;
end;

procedure TfrmWines.btnAddClick(Sender: TObject);
begin
  ButtonsEnter;
  //btnLabelGet.Click;
  wdatamod.mywines.Insert;
  edWinename.SetFocus;
end;

procedure TfrmWines.btnLabelGetClick(Sender: TObject);
begin
  if OpenPictureDialog1.Execute(Self.Handle) then
    Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;

2 个答案:

答案 0 :(得分:0)

我解决了这个问题并编码了为所有新记录添加常备图像的方法,如果我没有想要使用的图像:

if autoset.DataSet.State = dsInsert then
begin
   image1.Picture.Graphic.LoadFromFile('q:\sourcecode\mycellar\images\blk_wht_glass.jpg');
  Exit;
end;

以下是在添加新记录时阻止JPEG错误#42的新代码

procedure TfrmWines.AutoSetDataChange(Sender: TObject; Field: TField);
var
  JPG:TJPEGImage;
  ms:TMemoryStream;
begin
  if autoset.DataSet.State = dsInsert then
  begin
    image1.Picture.Graphic.LoadFromFile('q:\sourcecode\mycellar\images\blk_wht_glass.jpg');
    Exit;
  end;
  begin
    JPG:=TJPEGImage.Create;
    ms:=TMemoryStream.Create;
    try
      TBlobField(wdatamod.mywines.FieldByName('winelabel')).SaveToStream(ms);
      ms.Position := 0;
      JPG.LoadFromStream(ms);
      Image1.Picture.Assign(JPG);
   finally
     JPG.Free;
     ms.Free;
   end;
  end;
end;

答案 1 :(得分:0)

如果您的BLOB字段为空,则无法将数据加载到1023344a。在调用TJPEGImage之前,您需要检查该条件。

另外,我建议使用LoadFromStream()而不是使用TDataSet.CreateBlobStream()来复制内存中的BLOB数据。让TBlobStream.SaveToStream()直接从数据库读取数据,TJPEGImage知道如何使用流读取/写入BLOB数据。

尝试更像这样的事情:

DataSet

可替换地:

procedure TfrmWines.AutoSetDataChange(Sender: TObject; Field: TField);
var
  Fld: TField;
  JPG: TJPEGImage;
  strm: TStream;
begin
  Fld := wdatamod.mywines.FieldByName('winelabel');
  if (Fld.DataSet.State = dsInsert) or (TBlobField(Fld).BlobSize = 0) then
  begin
    Image1.Picture.LoadFromFile('q:\sourcecode\mycellar\images\blk_wht_glass.jpg');
  end else
  begin
    JPG := TJPEGImage.Create;
    try
      strm := Fld.DataSet.CreateBlobStream(Fld, bmRead);
      try
        JPG.LoadFromStream(strm);
      finally
        strm.Free;
      end;
      Image1.Picture.Assign(JPG);
    finally
      JPG.Free;
    end;
  end;
end;