2014-09-29 5 views
2

Я пытаюсь загрузить элемент управления изображения из образа blob, сохраненного ранее в базе данных sql. У меня есть testd так много способов, и я не могу заставить его работать. Кадр изображения сохраняется как:Загрузка изображения Delphi как blob в базе данных sql

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, если вы хотите получить изображение из базы данных.

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

Смежные вопросы