Skip to main content

Membaca Data Tipe BLOB di MS Access


Berbeda dengan tipe data lain non BLOB yang bisa langsung terbaca dengan membuka Datasheet view dari sebuah tabel, tipe data BLOB tidak bisa dibaca dengan cara itu. Dengan membuka Datasheet view tabel yang berisi data BLOB, kita hanya akan melihat sebuah tulisan Long Binary Data tanpa mengetahui bagaimana bentuk data yang sebenarnya adalah sebuah file.

Di MS Access, semua data BLOB, bila disimpan ke dalam sebuah tabel hanya ada tulisan Long Binary Data. Kita tidak bisa tahu seperti apakah bentuknya. Sebagai contoh, lihat gambar di bawah ini, Datasheet view tabel tblBlob. Pada tabel itu, terdapat berbagai macam file. Bila kolom non BLOB data seperti blobMeta, blobNamaFile, blobNamaEkstensi, blobUkuran, dan blobDeskripsi dihilangkan, maka kita tidak akan tahu jenis file apa yang ada didalamnya.

Gambar 1. Field/kolom blobData yang berisi data BLOB berupa file


Di sinilah letak pentingnya kolom atau field non-BLOB, seperti yang telah dibuat sebelumnya pada posting yang berjudul Mengenal Tipe Data BLOB di MS Access, yaitu untuk memberikan informasi yang relevan dengan data BLOB itu sendiri. Dengan mengetahui jenis file yang ada dalam field dengan tipe data BLOB, kita bisa memberi semacam perlakuan untuk mengkonversi file sesuai dengan jenisnya, sehingga data BLOB itu bisa terbaca.

Cara membaca data BLOB


Supaya data BLOB bisa terbaca, maka kita harus mentransfer data BLOB menjadi sebuah file. File itu akan disimpan sementara. Bila tidak dipergunakan lagi, kita bisa menghapusnya dengan tujuan untuk menghemat pemakaian media penyimpanan. File sementara itu disimpan di direktori sementara. Tujuannya, selain untuk menjaga kerahasiaan, juga untuk menghemat trafik jaringan. Setelah menjadi file, kita dapat membukanya dengan aplikasi yang sesuai.
Gambar 2. Data BLOB berupa file gambar (atas dan bawah)


Berikut ini adalah cara membaca data BLOB. Sebagai percobaan, kita akan menggunakan form frmBLOB yang telah dibuat sebelumnya di posting yang berjudul Menyimpan Data Tipe BLOB di MS Access.
  1. Bukalah Design View dari form frmBlob.
  2. Pada bagian Form Header, sisipkanlah text box dan tombol perintah dengan rincian properti sebagai berikut:
    1. Text box, Name= txtKriteria
    2. Button (Form Control), Name= cmdTampilkan, Caption= Tampilkan
    3. Button (Form Control), Name= cmdGanti, Caption= Ganti File yang Sudah Ada
  3. Pada bagian Form Detail, sisipkan sebuah tombol perintah dengan properti sebagai berikut: Name= cmdBukaFile, Caption= Buka File.
  4. Masih pada bagian Form Detail, sorotlah control yang bernama blobData. Aturlah properti Control Source menggunakan expression builder sehigga properti Control Source= =namaPathFile([blobid]). Control Source ini berisi fungsi namaPathFile yang diambil dari modul mdlBlobBaca.
  5. Pada bagian Form Footer, sisipkan sebuah tombol perintah dengan properti sebagai berikut: : Name= cmdBersihkan, Caption= Bersihkan File Temporer. Tujuannya untuk menghapus file yang tidak perlu, sehingga bisa menghemat pemakaian media penyimpanan.
Gamber 3. Data BLOB berupa file di-zip yang dibuka dengan MS Access

Design form frmBlob yang sudah diperbaharui bisa dilihat pada gambar di bawah ini.
Gambar 3. Form design dari frmBlob yang sudah diperbaharui
Berikut ini adalah kode VBA yang ada di modul form Form_frmBlob. Modul Form_frmBlob adalah modul yang ada di posting Menyimpan Data Tipe BLOB di MS Access (link di atas) dan telah diperbaharui sejalan dengan penambahan beberapa control tersebut di atas.
Option Compare Database
Private Const constStrTableName As String = "tblBlob"
Private Const constPrimaryKeyFieldName As String = "blobId"
Private strLocalSql  As String
Private Sub cmdBersihkan_Click()
  bersihkanTempFile
End Sub


Private Sub cmdGanti_Click()
  Dim rs As DAO.Recordset
  Dim strPathFile As String
  Dim lngMaxSize As Long
  Dim oleBlobData As Variant, oleBlobBacaData As Variant
  Dim strKriteria As Variant
  Dim strSql As String
  
  If Me.blobId = 0 Then
    MsgBox "Tidak ada Blob Id yang teridentifikasi", vbExclamation
    Exit Sub
  End If
  If IsNull(Me.txtNamaFile) Then
    MsgBox "Tidak ada nama file teridentifikasi", vbExclamation
    Me.txtNamaFile.SetFocus
    Exit Sub
  End If
  If Me.txtNamaFile = "" _
    Or Not adaNamaFile(Me.txtNamaFile) Then
    MsgBox "Tidak ada nama file teridentifikasi", vbExclamation
    Me.txtNamaFile.SetFocus
    Exit Sub
  End If
  
  
  strKriteria = Me.txtKriteria '
  strSql = strLocalSql & " WHERE " & constPrimaryKeyFieldName & "=" & strKriteria
  Set rs = daoDbs.OpenRecordset(strSql, dbOpenDynaset)
  rs.Edit
  If CLng(simpanBlob(Me.txtNamaFile, rs, "blobObjek")) > constBlobMaxSize Then
    MsgBox "Ukuran file lebih besar dari yang dipersyaratkan.", vbExclamation
    Exit Sub
  End If
  oleBlobData = simpanBlob(Me.txtNamaFile, rs, "blobObjek")
  rs!blobNamaFile = uraiPathFile(Me.txtNamaFile)(0)
  rs!blobNamaEkstensi = uraiPathFile(Me.txtNamaFile)(2)
  rs!blobUkuran = CLng(oleBlobData)
  rs.Update
  rs.Bookmark = rs.LastModified
  Me.blobId = rs!blobId
  
  If folderTemporer = "" Then Exit Sub
  strPathFile = folderTemporer & rs!blobNamaFile
  oleBlobBacaData = bacaBlob(rs, "blobObjek", strPathFile)
  Me.blobNamaFile = rs!blobNamaFile
  Me.blobNamaEkstensi = rs!blobNamaEkstensi
  Me.blobUkuran = rs!blobUkuran
  Me.blobData.Requery

  rs.Close
  Set rs = Nothing
End Sub

Private Sub cmdHapus_Click()
  Dim strKriteria As Variant
  Dim strPesan As String
  strKriteria = Me.blobId
  strPesan = "Data dengan Id nomor " & strKriteria & " akan dihapus?"
  If MsgBox(strPesan, vbYesNo, "Hapus Data BLOB") = vbYes Then
    daoDbs.Execute "DELETE * FROM " & constStrTableName & " WHERE " & constPrimaryKeyFieldName & "=" & strKriteria
    MsgBox "Data dengan Id nomor " & strKriteria & " telah dihapus.", vbInformation
    Me.blobNamaFile = vbNullString
    Me.blobNamaEkstensi = vbNullString
    Me.blobUkuran = vbNullString
    Me.blobId = vbNullString
    Me.blobDeskripsi = vbNullString
    Me.blobMeta = vbNullString
  
  End If
End Sub
  
Private Sub cmdPilihFile_Click()
  Me.txtNamaFile = kotakFileDialog(Nz(Me.txtNamaFile, ""))
  Me.txtNamaFile.SetFocus
End Sub
Private Sub cmdSimpan_Click()
  Dim rs As DAO.Recordset
  Dim strKriteria As Variant
  Dim strSql As String
  Cancel = False
  If IsNull(Me.blobNamaFile) Then
    MsgBox "Tidak ada file yang disimpan.", vbExclamation
    Cancel = True
    Exit Sub
  End If
  strKriteria = Me.blobId
  strSql = strLocalSql & " WHERE " & constPrimaryKeyFieldName & "=" & strKriteria
  Set rs = daoDbs.OpenRecordset(strSql, dbOpenDynaset)
  rs.Edit
  rs!blobDeskripsi = Me.blobDeskripsi
  rs.Update
  rs.Close
  Set rs = Nothing
End Sub
  
Private Sub cmdSimpanTambahBaru_Click()
  cmdSimpan_Click
  If Not Cancel Then cmdPilihFile_Click
End Sub
  
Private Sub cmdTambahBaru_Click()
  cmdPilihFile_Click
End Sub
  
Private Sub cmdTampilkan_Click()
  Dim rs As DAO.Recordset
  Dim strKriteria As Variant, oleBlobBacaData As Variant
  Dim strSql As String, strPathFile As String
  
  If IsNull(Me.txtKriteria) Then Exit Sub
  strKriteria = Me.txtKriteria
  strSql = strLocalSql & " WHERE " & constPrimaryKeyFieldName & "=" & strKriteria
  Set rs = daoDbs.OpenRecordset(strSql, dbOpenDynaset)
  
  If adaBlobId(CLng(strKriteria)) Then
    Me.blobId = rs!blobId
    Me.blobMeta = rs!blobMeta
    Me.blobDeskripsi = rs!blobDeskripsi
    Me.blobNamaFile = rs!blobNamaFile
    Me.blobNamaEkstensi = rs!blobNamaEkstensi
    
    If folderTemporer = "" Then Exit Sub
    strPathFile = folderTemporer & Me.blobNamaFile
    If Not adaNamaFile(strPathFile) Then oleBlobBacaData = copyBlobObjek(strSql, strPathFile)
    Me.blobData.Requery
  Else
    MsgBox "Tidak ada Blob Id: " & strKriteria, vbExclamation
  End If
  rs.Close
  Set rs = Nothing
  
End Sub

Private Sub cmdUpload_Click()
  Dim rs As DAO.Recordset
  Dim strPathFile As String
  Dim oleBlobData As Variant, oleBlobBacaData As Variant
    
  If IsNull(Me.txtNamaFile) Then
    MsgBox "Tidak ada nama file untuk di-upload.", vbExclamation
    Me.txtNamaFile.SetFocus
    Exit Sub
  End If
  If Me.txtNamaFile = "" _
    Or Not adaNamaFile(Me.txtNamaFile) Then
    MsgBox "Tidak ada nama file untuk di-upload.", vbExclamation
    Me.txtNamaFile.SetFocus
    Exit Sub
  End If
  Set rs = daoDbs.OpenRecordset(constStrTableName, dbOpenTable)
  rs.AddNew
  If CLng(simpanBlob(Me.txtNamaFile, rs, "blobObjek")) > constBlobMaxSize Then
    MsgBox "Ukuran file lebih besar dari yang dipersyaratkan.", vbExclamation
    Exit Sub
  End If
  oleBlobData = simpanBlob(Me.txtNamaFile, rs, "blobObjek")
  rs!blobNamaFile = uraiPathFile(Me.txtNamaFile)(0)
  rs!blobNamaEkstensi = uraiPathFile(Me.txtNamaFile)(2)
  rs!blobUkuran = CLng(oleBlobData)
  rs.Update
  rs.Bookmark = rs.LastModified
  Me.blobId = rs!blobId
    
  If folderTemporer = "" Then Exit Sub
  strPathFile = folderTemporer & rs!blobNamaFile
  oleBlobBacaData = bacaBlob(rs, "blobObjek", strPathFile)
  Me.blobNamaFile = rs!blobNamaFile
  Me.blobNamaEkstensi = rs!blobNamaEkstensi
  Me.blobUkuran = rs!blobUkuran
  Me.blobData.Requery
  
  rs.Close
  Set rs = Nothing
End Sub
  
Private Sub Form_Open(Cancel As Integer)
  strLocalSql = "SELECT * FROM " & constStrTableName
  Set daoDbs = CurrentDb()
End Sub
Private Sub cmdBukaFile_Click()
  If Me.blobId <> "" Or Me.blobId <> Null Then
  fHandleFile namaPathFile(Me.blobId), WIN_NORMAL
  End If

End Sub
Berikut ini adalah kode VBA yang ada di form Form_frmBlobBaca. Modul ini khusus digunakan untuk membaca data BLOB.
Option Compare Database
Option Explicit
Const BlockSize = 32768
Function bacaBlob(T As Recordset, sField As String, _
Destination As String)
    Dim intNumBlocks As Integer, intDestFile As Integer, i As Integer
    Dim lngFileLength As Long, lngLeftOver As Long
    Dim strFileData As String
    Dim varRetVal As Variant

    On Error GoTo Err_bacaBlob

    lngFileLength = T(sField).FieldSize()
    If lngFileLength = 0 Then
        bacaBlob = 0
        Exit Function
    End If

    intNumBlocks = lngFileLength \ BlockSize
    lngLeftOver = lngFileLength Mod BlockSize

    intDestFile = FreeFile
    Open Destination For Output As intDestFile
    Close intDestFile

    Open Destination For Binary As intDestFile

    varRetVal = SysCmd(acSysCmdInitMeter, _
    "Writing BLOB", lngFileLength / 1000)

    strFileData = T(sField).GetChunk(0, lngLeftOver)
    Put intDestFile, , strFileData

    varRetVal = SysCmd(acSysCmdUpdateMeter, lngLeftOver / 1000)

    For i = 1 To intNumBlocks
        strFileData = T(sField).GetChunk((i - 1) * BlockSize _
           + lngLeftOver, BlockSize)
        Put intDestFile, , strFileData

        varRetVal = SysCmd(acSysCmdUpdateMeter, _
        ((i - 1) * BlockSize + lngLeftOver) / 1000)
    Next i

    varRetVal = SysCmd(acSysCmdRemoveMeter)
    Close intDestFile
    bacaBlob = lngFileLength
    Exit Function

Err_bacaBlob:
    bacaBlob = -Err
    Exit Function

End Function
Function namaFile(intBlobId As Integer) As String
  Dim rs As DAO.Recordset
  Set rs = daoDbs.OpenRecordset("SELECT blobNamaFile FROM tblBlob WHERE blobId=" & intBlobId, dbOpenSnapshot)
  If rs.RecordCount = 0 Then
    namaFile = ""
  Else
    namaFile = Nz(rs.Fields("blobNamaFile").Value, "")
  End If
  rs.Close
  Set rs = Nothing
End Function
Function namaPathFile(intBlobId As Integer) As String
  If namaFile(intBlobId) <> "" Then
    namaPathFile = folderTemporer & namaFile(intBlobId)
  Else
    namaPathFile = ""
  End If

End Function
Function adaBlobId(lngBlobDataId As Long) As Boolean
Dim lngBlobId As Long
On Error GoTo Err_Msg
  lngBlobId = DCount("*", "tblBlob", "blobId=" & lngBlobDataId)
  adaBlobId = False
  If lngBlobId > 0 Then adaBlobId = True
Exit_Function:
  Exit Function
Err_Msg:
  MsgBox "Function adaBlobId, Error # " & str(Err.Number) & ", source: " & Err.Source & _
  Chr(13) & Err.description
  Resume Exit_Function
End Function
Function bersihkanTempFile()
  Dim objFSO  As Object, objFolder  As Object
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  
  objFSO.DeleteFile (folderTemporer & "*.*")
  Set objFSO = Nothing
End Function
Function copyBlobObjek(strTbl As String, strFilePath As String) As Variant 'OK

  Dim rst As DAO.Recordset
On Error GoTo Err_Msg
  Set rst = daoDbs.OpenRecordset(strTbl, dbOpenSnapshot)
  copyBlobObjek = bacaBlob(rst, "blobObjek", strFilePath)
  rst.Close
  Set rst = Nothing
Exit_Function:
  Exit Function
Err_Msg:
  MsgBox "Function copyBlobObjek, Error # " & str(Err.Number) & ", source: " & Err.Source & _
  Chr(13) & Err.description
  Resume Exit_Function
End Function


Untuk memperoleh contoh aplikasi BLOB, silakan ikuti petunjuk di bawah ini:
  1. Follow on Facebook yang ada di kotak sebelah kanan blog Access Terapan dengan memilih Following.
  2. Setelah itu, kirim email ke admin a.n. bambang.subro@gmail.com untuk memperoleh akses ke Google Drive Access Terapan.
  3. Setelah akses diperoleh, silakan buka Googlr Drive lalu klik bagian silakan download file blobSimpanBaca.zip. File ini berisi 5 objek Access:
    1. Tabel yang bernama tblBlob, khusus untuk menyimpan data BLOB beserta properti/metadata
    2. Form yang bernama frmBlob, khusus untuk antarmuka antara user dengan tblBlob. Di dalamnya berisi class modul Frm_frmBlob.
    3. Tiga Modul yang bernama mdlAPI, mdlBlobSimpan, dan mdlBaca digunakan untuk memporses upload file ke dalam database di tblBlob dan menampilkannya kembali.
  4. Bukalah form frmBlob dalam format Form View.
  5. Sebagai uji coba lakukan upload file (apa saja terserah), yang penting tidak boleh melebihi batas maksimum ukuran file yang dipersyaratkan pada deklarasi konstanta Public Const constBlobMaxSize.

Comments

  1. Perkenalkan, saya dari tim kumpulbagi. Saya ingin tau, apakah kiranya anda berencana untuk mengoleksi files menggunakan hosting yang baru?
    Jika ya, silahkan kunjungi website ini www.kbagi.com untuk info selengkapnya.

    Di sana anda bisa dengan bebas share dan mendowload foto-foto keluarga dan trip, music, video, filem dll dalam jumlah dan waktu yang tidak terbatas, setelah registrasi terlebih dahulu. Gratis :)

    ReplyDelete

Post a Comment

Posting Terpopuler

Normalisasi, Denormalisasi, dan Anomali Database

Membuat Relasi Database

Menampilkan Data MySQL dalam Form di Access