Home > Visual Basic > Implementasi konsep Data Access Object (DAO) di VB 6

Implementasi konsep Data Access Object (DAO) di VB 6

September 8, 2011

Maksud DAO disini bukan komponen Microsoft DAO yang populer di kalangan programmer vb untuk mengakses database tapi DAO disini lebih ke penerapan konsep DAO yang diperkenalkan Java untuk mengakses database.

Dalam konsep DAO kita akan memisahkan module program menjadi beberapa bagian/layer yaitu :

  1. Presentation
  2. Business Logic
  3. Data Access

Untuk presentation layer berhubungan dengan UI (user interface) .

Business Logic biasanya berhubungannya dengan entity class dan entity class sendiri merupakan representasi tabel-tabel yang ada di database biasanya juga disebut dengan istilah class model.

Terakhir Data Access yaitu bagian yang menangani urusan akses database biasanya terdapat operasi CRUD (Create, Read, Update, Delete).

Untuk kasusnya yang gampang aja🙂, kita akan mencoba mengakses data siswa yang mempunyai empat field yaitu nomor induk, nama, tempat lahir dan tanggal lahir.

Memulai project baru

Jalankan Visual Basih 6 kemudian pada dialog New Project aktifkan tab New kemudian pilih Standar EXE dan akhiri dengan menekan tombol Open.

Membuat Presentation Layer

Pada saat membuat project baru secara default sudah disiapkan 1 buah project  plus formnya

kemudian lakukan perubahan properties seperti gambar berikut :

untuk tampilannya kita akan desain seperti berikut :

Membuat Business Logic

Business Logic ada hubungannya dengan entity class yang merupakan representasi dari tabel-tabel yang ada didatabase.

Berdasarkan struktur tabel siswa diatas kita akan membuat sebuah class dengan nama Siswa yang mempunyai empat buah property yaitu Nomor Induk, Nama, Tempat Lahir dan Tanggal Lahir.

Jadi property ini sudah mewakili method mutator dan accessor yang sudah biasa kita kenal penggunakannya di Java.

Untuk menampung class-class yang berhubungan dengan Business Logic kita akan menambahkan project baru dengan tipe ActiveX DLL, adapun caranya seperti berikut :

Klik menu File -> Add Project setelah itu akan tampil dialog Add Project

kemudian pilih ActiveX DLL dan klik tombol Open

setelah itu akan ditambahkan 1 buah project dan class

kemudian lakukan perubahan properties seperti gambar berikut :

Adapun kode lengkap untuk class Siswanya adalah sebagai berikut :

Private m_nomorInduk    As String
Private m_nama          As String
Private m_tempatLahir   As String
Private m_tanggalLahir  As Date

Public Property Let NomorInduk(ByVal vData As String)
    m_nomorInduk = vData
End Property
Public Property Get NomorInduk() As String
    NomorInduk = m_nomorInduk
End Property

Public Property Let Nama(ByVal vData As String)
    m_nama = vData
End Property
Public Property Get Nama() As String
    Nama = m_nama
End Property

Public Property Let TempatLahir(ByVal vData As String)
    m_tempatLahir = vData
End Property
Public Property Get TempatLahir() As String
    TempatLahir = m_tempatLahir
End Property

Public Property Let TanggalLahir(ByVal vData As Date)
    m_tanggalLahir = vData
End Property
Public Property Get TanggalLahir() As Date
    TanggalLahir = m_tanggalLahir
End Property

Membuat Data Access

Lapisan ini biasanya berisi operasi CRUD (Create, Read, Update, Delete), tapi kita akan menggunakan istilah yang sedikit berbeda untuk nama operasinya yaitu :

  1. Save
  2. Update
  3. Delete
  4. GetAll
  5. GetByName
  6. GetByNIS

Biasanya untuk penamaan classnya cukup menambahkan akhiran (suffixes) Dao untuk setiap class entitynya. Contoh untuk class entity Siswa, biasanya class Data Accessnya diberi nama SiswaDao.

Oke langsung saja kita tambahkan project baru dengan mengklik menu File -> Add Project setelah itu akan tampil dialog Add Project

kemudian pilih ActiveX DLL dan klik tombol Open

setelah itu akan ditambahkan 1 buah project dan class

kemudian lakukan perubahan properties seperti gambar berikut :

Adapun kode lengkap untuk class SiswaDaonya adalah seperti berikut :

Private cmd     As ADODB.Command
Private strSql  As String

Private Function MappingRowToObject(ByVal rs As ADODB.Recordset) As SiswaModel.siswa
    Dim siswa As New SiswaModel.siswa

    With siswa
        .NomorInduk = IIf(IsNull(rs("nomor_induk").Value), "", rs("nomor_induk").Value)
        .nama = IIf(IsNull(rs("nama").Value), "", rs("nama").Value)
        .TempatLahir = IIf(IsNull(rs("tempat_lahir").Value), "", rs("tempat_lahir").Value)
        .TanggalLahir = IIf(IsNull(rs("tgl_lahir").Value), "1/1/1900", rs("tgl_lahir").Value)
    End With

    Set MappingRowToObject = siswa
End Function

1. Method Save

Public Function Save(ByVal siswa As SiswaModel.siswa, ByVal conn As ADODB.Connection) As Integer
    On Error GoTo errHandle

    strSql = "INSERT INTO siswa (nomor_induk, nama, tempat_lahir, tgl_lahir) VALUES (?, ?, ?, ?)"

    Set cmd = New ADODB.Command
    With cmd
        .ActiveConnection = conn
        .CommandType = adCmdText
        .CommandText = strSql

        .Parameters(0) = siswa.NomorInduk
        .Parameters(1) = siswa.nama
        .Parameters(2) = siswa.TempatLahir
        .Parameters(3) = siswa.TanggalLahir

        .Execute Save
    End With
    Set cmd = Nothing

    Exit Function

errHandle:
    Save = 0
End Function

2. Method Update

Public Function Update(ByVal siswa As SiswaModel.siswa, ByVal conn As ADODB.Connection) As Integer
    On Error GoTo errHandle

    strSql = "UPDATE siswa SET nama = ?, tempat_lahir = ?, tgl_lahir = ? WHERE nomor_induk = ?"

    Set cmd = New ADODB.Command
    With cmd
        .ActiveConnection = conn
        .CommandType = adCmdText
        .CommandText = strSql

        .Parameters(0) = siswa.nama
        .Parameters(1) = siswa.TempatLahir
        .Parameters(2) = siswa.TanggalLahir
        .Parameters(3) = siswa.NomorInduk

        .Execute Update
    End With
    Set cmd = Nothing

    Exit Function

errHandle:
    Update = 0
End Function

3. Method Delete

Public Function Delete(ByVal nis As String, ByVal conn As ADODB.Connection) As Integer
    On Error GoTo errHandle

    strSql = "DELETE FROM siswa WHERE nomor_induk = ?"

    Set cmd = New ADODB.Command
    With cmd
        .ActiveConnection = conn
        .CommandType = adCmdText
        .CommandText = strSql

        .Parameters(0) = nis

        .Execute Delete
    End With
    Set cmd = Nothing

    Exit Function

errHandle:
    Delete = 0
End Function

4. Method GetAll

Public Function GetAll(ByVal conn As ADODB.Connection) As Scripting.Dictionary
    Dim daftarSiswa     As New Scripting.Dictionary
    Dim rs              As ADODB.Recordset

    Dim key             As Long

    On Error GoTo errHandle

    strSql = "SELECT nomor_induk, nama, tempat_lahir, tgl_lahir " & _
             "FROM siswa " & _
             "ORDER BY nomor_induk"

    Set rs = OpenRecordset(strSql, conn)
    Do While Not rs.EOF

        Call daftarSiswa.Add(key, MappingRowToObject(rs))
        key = key + 1

        rs.MoveNext
    Loop
    Call CloseRecordset(rs)

    Set GetAll = daftarSiswa

    Exit Function
errHandle:
    Set GetAll = Nothing
End Function

5. Method GetByName

Public Function GetByName(ByVal nama As String, ByVal conn As ADODB.Connection) As Scripting.Dictionary
    Dim daftarSiswa     As New Scripting.Dictionary
    Dim rs              As ADODB.Recordset

    Dim key             As Long

    On Error GoTo errHandle

    nama = Replace(nama, "'", "''")

    strSql = "SELECT nomor_induk, nama, tempat_lahir, tgl_lahir " & _
             "FROM siswa " & _
             "WHERE nama LIKE '%" & nama & "%' " & _
             "ORDER BY nomor_induk"

    Set rs = OpenRecordset(strSql, conn)
    Do While Not rs.EOF

        Call daftarSiswa.Add(key, MappingRowToObject(rs))
        key = key + 1

        rs.MoveNext
    Loop
    Call CloseRecordset(rs)

    Set GetByName = daftarSiswa

    Exit Function
errHandle:
    Set GetByName = Nothing
End Function

6. Method GetByNIS

Public Function GetByNIS(ByVal nis As String, ByVal conn As ADODB.Connection) As SiswaModel.siswa
    Dim siswa   As SiswaModel.siswa
    Dim rs      As ADODB.Recordset

    On Error GoTo errHandle

    strSql = "SELECT nomor_induk, nama, tempat_lahir, tgl_lahir " & _
             "FROM siswa " & _
             "WHERE nomor_induk = '" & nis & "'"
    Set rs = OpenRecordset(strSql, conn)
    If Not rs.EOF Then
        Set siswa = MappingRowToObject(rs)
    End If
    Call CloseRecordset(rs)

    Set GetByNIS = siswa

    Exit Function

errHandle:
    Set GetByNIS = Nothing
End Function

Class SiswaDao diatas membutuhkan referensi/library tambahan berikut :

Karena class SiswaModel dan SiswaDao berbeda project sehingga untuk mengakses class Siswa berikut propertiesnya dari SiswaDao perlu ditambahkan referensi SiswaModel.

Referensi Microsoft Scripting Runtime mirip dengan class Collection.

Terakhir kita akan membahas bagaimana mengakses class Siswa dan SiswaDao dari form Siswa tapi sebelumnya kita harus menambahkan referensi SiswaModel, SiswaDataAccess, Microsoft ADO 2x dan Microsoft Scripting Runtime.

1. Menyimpan data

Private Sub cmdSimpan_Click()
    Dim siswa As New SiswaModel.siswa

    With siswa
        .NomorInduk = txtNomorInduk.Text
        .nama = txtNama.Text
        .TempatLahir = txtTempatLahir.Text
        .TanggalLahir = dtpTanggal.Value
    End With

    result = siswaDao.Save(siswa, conn)
    If result > 0 Then
        MsgBox "Data siswa sudah disimpan"
        Call LoadDataSiswa

    Else
        MsgBox "Data siswa gagal disimpan"
    End If

    Set siswa = Nothing
End Sub

2. Mengupdate data

Private Sub cmdPerbaiki_Click()
    Dim siswa As New SiswaModel.siswa

    With siswa
        .NomorInduk = txtNomorInduk.Text
        .nama = txtNama.Text
        .TempatLahir = txtTempatLahir.Text
        .TanggalLahir = dtpTanggal.Value
    End With

    result = siswaDao.Update(siswa, conn)
    If result > 0 Then
        MsgBox "Data siswa sudah disimpan"
        Call LoadDataSiswa

    Else
        MsgBox "Data siswa gagal disimpan"
    End If

    Set siswa = Nothing
End Sub

3. Menghapus data

Private Sub cmdHapus_Click()
    Dim nis As String

    nis = lsvSiswa.ListItems(lsvSiswa.SelectedItem.Index).SubItems(1)

    If MsgBox("Apakah proses penghapusan ingin dilanjutkan ?", vbExclamation + vbYesNo, "Konfirmasi") = vbYes Then
        result = siswaDao.Delete(nis, conn)
        If result > 0 Then
            MsgBox "Data siswa sudah dihapus"
            Call LoadDataSiswa

            txtNomorInduk.Text = ""
            txtNama.Text = ""
            txtTempatLahir.Text = ""

            txtNomorInduk.SetFocus

        Else
            MsgBox "Data siswa gagal dihapus"
        End If
    End If
End Sub

4. Menampilkan semua data

Private Sub FillToListView(ByVal siswa As SiswaModel.siswa)
    Dim row As Long

    With lsvSiswa
        row = .ListItems.Count + 1

        .ListItems.Add , , row
        .ListItems(row).SubItems(1) = siswa.NomorInduk
        .ListItems(row).SubItems(2) = siswa.nama
        .ListItems(row).SubItems(3) = siswa.TempatLahir

        If siswa.TanggalLahir <> "1/1/1900" Then
            .ListItems(row).SubItems(4) = Format(siswa.TanggalLahir, "dd/MM/yyyy")
        End If
    End With
End Sub

Private Sub LoadDataSiswa(Optional ByVal nama As String = "")
    Dim daftarSiswa As New Scripting.Dictionary
    Dim siswa       As SiswaModel.siswa

    Dim key         As Variant

    If Len(nama) > 0 Then
        Set daftarSiswa = siswaDao.GetByName(nama, conn)
    Else
        Set daftarSiswa = siswaDao.GetAll(conn)
    End If

    lsvSiswa.ListItems.Clear

    For Each key In daftarSiswa
        Set siswa = daftarSiswa.Item(key)

        Call FillToListView(siswa)
    Next

    Set siswa = Nothing
    Set daftarSiswa = Nothing
End Sub

kemudian tinggal panggil di event Form_Load

Private Sub Form_Load()
    Call LoadDataSiswa
End Sub

5. Menampilkan data berdasarkan nama

Private Sub cmdCariByName_Click()
    Call LoadDataSiswa(txtKeywordPencarian.Text)
End Sub

6. Menampilkan data berdasarkan nomor induk

Private Sub cmdCariByNIS_Click()
    Dim siswa As SiswaModel.siswa

    Set siswa = siswaDao.GetByNIS(txtNomorInduk.Text, conn)
    If Not siswa Is Nothing Then
        With siswa
            txtNama.Text = .nama
            txtTempatLahir.Text = .TempatLahir

            If .TanggalLahir <> "1/1/1900" Then
                dtpTanggal.Value = siswa.TanggalLahir
            End If
        End With

    Else
        MsgBox "Data siswa tidak ditemukan"
    End If

    Set siswa = Nothing
End Sub

Selamat MENCOBA🙂

  1. September 12, 2011 at 3:37 pm

    Mantab, ikut coba om🙂

    • September 13, 2011 at 2:07 am

      Oke om🙂

  2. fajrin zamzam
    September 23, 2011 at 7:28 pm

    mantap bang… sekalian implementasi konsep ado-nya dong… hehehehe

    • September 24, 2011 at 2:02 am

      Kan udah om, implementasi konsep DAO diatasnya menggunakan ADO😀

  3. October 1, 2011 at 3:17 am

    thanks bang tutornya sangat bermanfaat.

    • October 2, 2011 at 4:12 am

      Sama2x om

  4. glenk
    November 12, 2011 at 1:01 am

    Bang Admin, alangkah menarik topik pembahasan ini jika diimplementasikan pada reporting tool seperti Active Report atau Crystal Report. Mungkin bisa jadi solusi untuk penerapan metode push report di vb6. trims.

    • November 12, 2011 at 2:37 am

      Klo VB 6 + AR kemungkinan pake komponen RDO om karna ada method OpenResultsetnya tapi belum sempat dicoba😀

  5. glenk
    November 12, 2011 at 3:16 am

    Kalo sempet, tolong artikel tutorial untuk VB6 + AR dan RDO dipadu dengan Konsep DAO-nya ya bang? kita ditunggu terobosan baru nya….

    • November 12, 2011 at 11:09 am

      Pake VB .NET + AR .NET aja om udah sy coba berhasil😀

  6. glenk
    November 12, 2011 at 4:17 am

    Bang, admin kalo pake konsep dao seperti diatas, kalau untuk move first, prev, next, last record implementasinya bagaimana? thanks.

    • November 12, 2011 at 11:12 am

      Kan sama aja om, hasil perintah pagingnya dalam bentuk recordset trus disimpan dalam class Scripting.Dictionary.
      Untuk kode mungkin nyusul soalnya sekarang lagi mode “sok sibuk” on😀

    • noshade
      November 26, 2011 at 3:48 pm

      bisa make cara bikin recordset di form yg digunakan untuk menampung queri awal, dan perpage nya tinggal dipilah2 berdasarkan ketentuan jumlah baris di tabel view yg kita tentukan, jangan lupa bikin variabel untuk menyimpan unik id dari baris pertama view tabel dan baris terakhir view tabel karena itu yg akan dijadikan patokan buat bikin page-page nya :p

      bisa juga dibikin class page, class sql queri nya agar kaga repot2 bikin variabel dan intruksi yg sama tiap form

      • November 27, 2011 at 1:09 am

        Nah itu ada masukan dari om noshade, sekalian om ditunggu sumbangan kodenya😀

  7. diyu
    March 14, 2012 at 1:43 pm

    om kalau boleh tau cara implementasikan untuk ibanking dibuatkan modulnya… maaf hanya orang bodoh saya nih

    • March 15, 2012 at 12:53 am

      Modul ibanking ? ya enggak punya lah om sy enggak kerja di bank lagi😀

  8. June 30, 2012 at 9:20 pm

    mas tanya lagi, diatas terdapat fasilitas filter men NIS, nah yang saya tanyakan gimana kalau pencariannya tidak ditampilkan pada textbox, tapi hanya pada listviewnya saja, kalo di datagrid setelah kondisi tinggal direfresh saja, tp di listview ndak bisa🙂
    mhon kasih tipsnya
    makasih…

    • June 30, 2012 at 9:38 pm

      Klo berdasarkan contoh diatas ya tinggal panggil aja method LoadDataSiswa untuk parameternya diset string kosong :

       Call LoadDataSiswa("")
      
  9. Haviz
    May 27, 2013 at 10:30 am

    Mas, kalau implementasi konsep DAO di visual basic .net gimana ?
    Mohon penjelasannya..

    Thanks

    • June 25, 2013 at 12:30 pm

      Sy sudah pernah posting masalah ini, tapi menggunakan bahasa C#, coba aja dipelajari dulu, toh konsepnya sama saja untuk semua bahasa pemrograman di .NET
      1. Mengakses database MySQL menggunakan C# bagian 1
      2. Mengakses database MySQL menggunakan C# bagian 2

      • Hvz
        June 26, 2013 at 10:50 am

        Maaf mas bos, saya sudah praktekkan postingan yang itu, dan alhamdulillah Allah paring berhasil. Justru saya mau tanya konsep DAO di visual basic .NET, maklum saya masih baru didunia pemrograman.

        Trims

        • June 26, 2013 at 11:38 am

          Loh bukannya klo sudah berhasil mencoba yg versi C# konversi ke VB .NETnya lebih gampang.

          Klo konsepnya kan sama aja deh mau yg pake VB 6, VB .NET atau C#

          • Hvz
            June 26, 2013 at 12:06 pm

            Mungkin bagi sampean gampang bos, kan dah saya bilang saya baru didunia pemrograman, he..he…

            • June 26, 2013 at 2:30 pm

              Wowww panjang om, lain kali yah😀

              • Hvz
                June 26, 2013 at 8:28 pm

                Ok, di tunggu om ….

                • June 27, 2013 at 6:24 pm

                  Yuph

  10. agus amirudin
    August 12, 2013 at 2:57 pm

    Mas admin.. tolong dong gimana caranya pada saat melakukan pencarian ditampilkan form tabel data yang akan kita cari. Terimakasih Mas…

  11. Dhony
    January 25, 2014 at 3:43 am

    om mohon pencerahannya nehh omm ,, mau tanya nehh saya lagi buat skripsi ,, tentang polling sms dengan menggunakan vb.net , ada yang nyimpan skrip untuk brodcasst massage nya ngak omm ,, plesss

  1. No trackbacks yet.
Comments are closed.
%d bloggers like this: