Delphi加载图像在sql数据库中保存为blob

时间:2014-09-29 15:27:55

标签: sql image delphi blob

我正在尝试从之前保存在sql数据库中的图像blob加载一个Image控件。我已经测试了很多方法,但我无法使其工作。图像blob保存为:

qry.SQL.Text := 'update tbl set pic = :blobVal where id = :idVal';
qry.Parameters.ParamByName('blobVal').LoadFromFile('c:\sample.jpg', ftBlob);
qry.Parameters.ParamByName('idVal').Value := 1;

任何建议?

4 个答案:

答案 0 :(得分:5)

这里有很多关于将图像加载到数据库的步骤,但我找不到一个带有更新或插入参数的图像。

您可以简单地为参数指定图形对象。 如果要存储不同的图形类型,则应添加列 保持信息应该存储哪种图形(例如jpeg,bmp,png)。 如果要从数据库中检索图片,则能够创建所需的TGraphic类后代。

uses jpeg, pngimage;

type
 TitTYPES=(itJPG,itPNG,itBMP);

procedure TDEMO.Button1Click(Sender: TObject);
var
 jp:TJpegimage;
 g:TGraphic;
begin

  jp:=TJpegimage.Create;
  try
    ads.Close;
    jp.LoadFromFile('C:\Bilder1\PIC.jpg');
    ads.SQL.Text := 'Insert into IMGBlob (ID,Blob,typ) Values (:ID,:BLOB,:typ)';
    ads.Parameters[0].Value := 1;
    ads.Parameters[1].Assign(jp);
    ads.Parameters[2].Value := itJPG;
    ads.ExecSQL;

    ads.SQL.Text := 'Select * from IMGBlob where ID=:ID';
    ads.Parameters[0].Value := 1;
    ads.Open;
    try
      case TitTYPES(ads.FieldByName('typ').AsInteger) of
           itJPG: g:=TJpegimage.Create;
           itPNG: g:=TPNGImage.Create;
           itBMP: g:=TBitmap.Create;
      end;
    g.Assign(ads.FieldByName('Blob'));
    Image1.Picture.Assign(g);
    finally
      g.Free;
    end;
  finally
    jp.Free;
  end;
end;

答案 1 :(得分:3)

要将BLOB字段加载到图像中,您需要使用TDataSet.CreateBlobStream。

var
  Stream: TStream;
  JPG: TJpegImage;
begin
  JPG := TJpegImage.Create;
  try
    Stream := Qry.CreateBlobStream(Qry.FieldByName('BLOBVAL'), bmRead);
    try
      JPG.LoadFromStream(Stream);
    finally
      BlobStream.Free;
    end;
  finally
    JPG.Free;
  end;
end;

要存储图像,您需要执行相反的操作:

var
  Stream: TBlobStream;
  Jpg: TJpegImage;
begin
  Jpg := TJpegImage.Create;
  try
    Jpg.Assign(Image1.Picture.Graphic);
    // Assign other query parameters here
    Stream := Qry.CreateBlobStream(Qry.FieldByName('BLOBVAL'), bmWrite);
    try
      Jpg.SaveToStream(Stream);
      Qry.ExecSQL;
    finally
      Stream.Free;
    end;
  finally
    Jpg.Free;
  end;
end;

TDBImage仅适用于位图(当字段为ftGraphic时),因此无法直接使用JPEG图像。最简单的方法是将blob作为JPEG加载,并将其分配给数据集的事件处理程序中的标准TImage.Picture.Graphic(例如它的AfterScroll事件)。

答案 2 :(得分:0)

保存到db:

var
  ms:tmemorystream;
Begin  
  ms:=tmemorystream.create;
  ms.position:=0;
  image1.picture.bitmap.savetostream(ms);
  ms.position:=0;
  with yourfield as tblobfield do
    loadfromstream(ms);
  freeandnil(ms);
end; 

从db:

加载
var
  ms:tmemorystream;
Begin  
  ms:=tmemorystream.create;
  ms.position:=0;
  with yourfield as tblobfield do
    savetostream(ms);
  ms.position:=0;
  image1.picture.bitmap.loadfromstream(ms);
  freeandnil(ms);
end; 

答案 3 :(得分:0)

它不适用于所有图形类型,例如PNG等。

这也适用于PNG:

var mBitmap : TGraphic;
var mStream : TStream;
var mClass  : TGraphicClass;
begin
      mStream := Query.CreateBlobStream(Query.FieldByName('yourBlobfield'), bmRead);
      mClass  := GetGraphicClassForFileExtension(mStream.ReadAnsiString);
      mBitmap := mClass.Create;
      mBitmap.LoadFromStream(mStream);
      Image4.Picture.Assign(mBitmap);
 end;