2014-09-29 3 views
2

이전에 SQL 데이터베이스에 저장된 이미지 BLOB에서 이미지 컨트롤을로드하려고합니다. 여러 가지 방법으로 테스트 했으므로 제대로 작동하지 않습니다. 이미지 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

답변

3

이미지를 데이터베이스로로드하는 데 많은 걸음을 내딛었지만 업데이트 또는 삽입 매개 변수를 찾지 못했습니다.

매개 변수에 그래픽 개체를 지정하기 만하면됩니다. 다른 그래픽 유형을 저장하려면 열 종류 을 추가하여 어떤 종류의 그래픽을 저장해야하는지 (예 : jpeg, bmp, png)를 유지해야합니다. 데이터베이스에서 그림을 검색하려면 필요한 TGraphic 클래스 자손을 만들 수 있어야합니다. 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에 저장

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; 

는 반대해야 할 것, 다시 이미지를 저장하려면

TDBImage

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; 
만 비트 맵 작동하도록 설계되어 (필드 ftGraphic 인 경우), 그래서하지 않습니다 JPEG 이미지로 직접 작업하십시오. 가장 쉬운 방법은 blob을 JPEG로로드 한 다음 데이터 세트의 이벤트 핸들러에있는 TImage.Picture.Graphic 표준 (예 : AfterScroll 이벤트)에 할당하는 것입니다.

0

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

로컬 객체에 대해 무의미한'FreeAndNil'보다는'try..finally' 블록을 보는 것이 좋을 것입니다. – TLama

관련 문제