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.
- Bukalah Design View dari form frmBlob.
- Pada bagian Form Header, sisipkanlah text box dan tombol perintah dengan rincian properti sebagai berikut:
- Text box, Name= txtKriteria
- Button (Form Control), Name= cmdTampilkan, Caption= Tampilkan
- Button (Form Control), Name= cmdGanti, Caption= Ganti File yang Sudah Ada
- Pada bagian Form Detail, sisipkan sebuah tombol perintah dengan properti sebagai berikut: Name= cmdBukaFile, Caption= Buka File.
- 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.
- 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:
- Follow on Facebook yang ada di kotak sebelah kanan blog Access Terapan dengan memilih Following.
- Setelah itu, kirim email ke admin a.n. bambang.subro@gmail.com untuk memperoleh akses ke Google Drive Access Terapan.
- Setelah akses diperoleh, silakan buka Googlr Drive lalu klik bagian silakan download file blobSimpanBaca.zip. File ini berisi 5 objek Access:
- Tabel yang bernama tblBlob, khusus untuk menyimpan data BLOB beserta properti/metadata
- Form yang bernama frmBlob, khusus untuk antarmuka antara user dengan tblBlob. Di dalamnya berisi class modul Frm_frmBlob.
- Tiga Modul yang bernama mdlAPI, mdlBlobSimpan, dan mdlBaca digunakan untuk memporses upload file ke dalam database di tblBlob dan menampilkannya kembali.
- Bukalah form frmBlob dalam format Form View.
- 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.
Perkenalkan, saya dari tim kumpulbagi. Saya ingin tau, apakah kiranya anda berencana untuk mengoleksi files menggunakan hosting yang baru?
ReplyDeleteJika 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 :)