2014-09-29 33 views
2

我想加载一个图像控制从一个图像blob先前保存在一个SQL数据库。我测试了很多方法,我不能使它的工作。图像blob保存为:德尔福加载图像保存为一个SQL数据库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; 

有什么建议吗?

+0

请添加更多的细节,是我们都在谈论它的SQL服务器和哪个组件是由你的'QRY代表'变量? – whosrdaddy 2014-09-29 15:34:40

回答

3

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

您可以简单地将图形对象分配给您的参数。 如果你想存储不同的图形类型,你应该添加一个列 保存信息哪种图形应该被存储(例如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; 
2

要将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事件)。

0

保存到数据库:

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; 

从数据库负载:

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

这里很高兴看到一个'try..finally'块,而不是毫无意义的'FreeAndNil'作为本地对象。 – TLama 2014-10-01 11:57:38