2014-09-29 29 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