Friday, March 30, 2018

Menyimpan gambar ke database menggunakan Delphi

Tutorial berikut menjelaskan bagaimana cara menyimpan gambar atau foto ke database menggunakan Delphi dan databasenya MS. Access, MySQL dan Microsoft SQL Server. Sebelumnya saya sudah membuat tulisan cara menyimpan gambar atau foto ke database tetapi menggunakan Visual Basic.

Simpan gambar ke database dengan Delphi

Sebenarnya tutorial tentang bagaimana cara menyimpan gambar atau foto ke database menggunakan delphi sudah banyak di internet, tetapi saya tidak menemukan satupun dari mereka yang cocok dalam artian programnya oke dari satu sisi tetapi error di sisi yang lain, oleh karena itu saya mempunyai ide untuk menulis artikel ini.

Database untuk menyimpan gambar

Pada contoh ini saya menggunakan database MS Access, tentu saja boleh menggunakan yang lain seperti database MySQL dengan komponen seperti MySQL DAC dari microOLAP, MyDAC dari Devart atau dari yang lainnya.

Program ini, selain menyimpan gambar juga menampilkan gambarnya, untuk format dan tabel databasenya silahkan lihat tulisan cara menyimpan gambar atau foto menggunakan Visual Basic.

Untuk menghemat waktu teman-teman berikut langsung saja saya bahas program dan source code-nya. Oh iya… Sebelum masuk ke pembahasan ada baiknya saya jelaskan dahulu, inti dari program ini adalah menyimpan gambar ke database dengan format gambar .bmp, kenapa harus format .bmp? Apakah format yang lain tidak didukung? Tentu saja didukung tetapi ada keperluan khusus yang mengharuskan formatnya harus berupa .bmp misalnya ketika teman-teman ingin menampilkan gambar ke report atau sebuah laporan yang menggunakan komponen Quick Report gambar yang didukung hanya yang memiliki format bitmap(.bmp).

Komponen pada form Delphi

Sekarang yang harus kita lakukan adalah menambahkan komponen ke form seperti pada gambar di atas, dengan komponen dan propertinya sebagai berikut :

  • ADOConnection1 : LoginPrompt = False. Buat koneksinya dengan cara klik ganda pada komponen ADOConnection1 kemudian klik Build->Pilih : Microsoft Jet 4.0 OLE DB Provider->Carilah lokasi databasenya->Ok->Ok
  • ADOQuery1 : Connection = ADOConnection1, CursorType = ctStatic, Active = True. Sekarang klik kanan ADOQuery1 dan pilih Fields Editor->Klik kanan->Add all fields.
  • DataSource1 : DataSet = ADOQuery1
  • DBGrid1 : ReadOnly = True, DataSource = DataSource1. Kita akan menampilkan field “nama” saja, untuk itu klik kanan DBGrid1->Columns Editor. Lihat gambar di bawah, klik 1->Isi sesuai 2 dan 3.
  • OpenPictureDialog1 : Filter = All (*.jpg;*.jpeg;*.bmp)|*.jpg;*.jpeg;*.bmp|JPEG Image File (*.jpg)|*.jpg|JPEG Image File (*.jpeg)|*.jpeg|Bitmaps (*.bmp)|*.bmp
  • Label1 : Caption = Nama
  • Edit1 : Text = ” (kosongkan)
  • Image1 : Stretch = True
  • Button1 : Caption = Cari gambar dan simpan

Kode menyimpan gambar ke database

Selanjutnya kita akan menulis barisan kode programnya.
Tambahkan sedikit baris kode berikut pada bagian uses :

jpeg, axCtrls

Pada bagian type tambahkan barisan kode berikut :

procedure tampildata();
procedure convertobmp(filename:TFileName);

Tambahkan juga procedure berikut di bawah implementation :

// Untuk menyegarkan data pada ADOQuery1
procedure TForm1.tampildata();
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.text := 'select * from tb_foto';
  ADOQuery1.Active:=true;
  DBGrid1CellClick(DBGrid1.Columns[0]);
end;

// Konversi setiap gambar ke format Bitmap
// Kode ini saya dapatkan dari stackoverflow.com
procedure TForm1.convertobmp(filename:TFileName);
Var
     OleGraphic               : TOleGraphic;
     fs                       : TFileStream;
     Source                   : TImage;
     BMP                      : TBitmap;
Begin
     Try
          OleGraphic := TOleGraphic.Create; //The magic class!

          fs := TFileStream.Create(filename, fmOpenRead Or fmSharedenyNone);
          OleGraphic.LoadFromStream(fs);

          Source := Timage.Create(Nil);
          Source.Picture.Assign(OleGraphic);

          BMP := TBitmap.Create; //Converting to Bitmap
          bmp.Width := Source.Picture.Width;
          bmp.Height := source.Picture.Height;
          bmp.Canvas.Draw(0, 0, source.Picture.Graphic);

          image1.Picture.Bitmap := bmp; //Show the bitmap on form
          image1.Refresh;
          fs.Free;
          OleGraphic.Free;
          Source.Free;
          bmp.Free;
     Finally

     End;
end;

Sekarang klik ganda button yang ada pada form dan gantikan kodenya dengan yang di bawah ini :

procedure TForm1.Button1Click(Sender: TObject);
var gambar : TMemorystream;
begin
  if(Edit1.Text = '') then begin
    ShowMessage('Silahkan isi nama dulu');
    edit1.SetFocus;
    exit;
  end;
  if OpenPictureDialog1.Execute then begin
    try
      convertobmp(OpenPictureDialog1.FileName);
      gambar := TMemorystream.Create;
      Image1.Picture.Graphic.SaveToStream(gambar);
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Text := 'insert into tb_foto (nama,gambar) values (:p0, :p1)';
      ADOQuery1.Parameters[0].Value :=  Edit1.text;
      ADOQuery1.Parameters[1].LoadFromStream(gambar,ftBlob);
      ADOQuery1.ExecSQL;
      tampildata();
    except
    on E:Exception do
      ShowMessage('Maaf terjadi kesalahan.' + #13 + 'Error : ' + E.Message);
    end;
  end;
end;

Ketika DbGrid di klik, gantikan kode eventnya sebagai berikut :

procedure TForm1.DBGrid1CellClick(Column: TColumn);
var
  Stream : TADOBlobStream;
  GambarBmp : TBitmap;
  Buffer : Word;
begin
  if (not ADOQuery1.Eof) then begin
    Edit1.Text:= DBGrid1.Fields[0].Text;
    GambarBmp := TBitmap.Create;
    Stream := TADOBlobStream.Create(ADOQuery1gambar,bmRead);
    Stream.Read(Buffer,SizeOf(Buffer));
    Stream.Position := 0;
    GambarBmp.LoadFromStream(Stream);
    Image1.Picture.Bitmap := GambarBmp;
    image1.Refresh;
  end;
end;

Dengan database MySQL

Saya mencoba untuk komponen MyDAC dari Devart perlu dimodifikasi sedikit untuk even DbGrid sebagai berikut:

procedure TForm1.DBGrid1CellClick(Column: TColumn);
var
  Stream : TMemoryStream;
  GambarBmp : TBitmap;
begin
  if (not MyQuery1.Eof) then begin
    Edit1.Text:= DBGrid1.Fields[0].Text;
    GambarBmp := TBitmap.Create;
    Stream := TMemoryStream.Create;
    try
      MyQuery1gambar.SaveToStream(Stream);
      Stream.Position := 0;
      GambarBmp.LoadFromStream(Stream);
      Image1.Picture.Bitmap := GambarBmp;
      image1.Refresh;
    finally
      Stream.Free;
    end;
  end;
end;

Sedangkan MySQL DAC dari microOLAP tidak terjadi masalah dengan kode yang sebelumnya.

Dengan database Microsoft SQL Server

Untuk SQL Server <= 2005 biasanya tipe data blob untuk penyimpanan foto belum didukung, oleh karena itu bisa menggunakan alternatif lain yaitu gunakan tipe data varbinary(max). Nah jika MS. SQL Server > 2005, kayaknya sudah mendukung tipe data Blob.

1 comment:

  1. z_kop.ParamByName('kop').LoadFromStream(gambar,ftBlob);

    sy erornya pada ftBlob

    ReplyDelete