Client Server Metotologi


Client-server adalah model komunikasi yang diterapkan dalam aplikasi komputer, dimana server disini berfungsi sebagai penyedia yang melayani kebutuhan client dalam hal ini khususnya data yang disimpan dalam database server. Aplikasinya sendiri dapat tersimpan pada komputer client. Database yang tersimpan pada server digunakan secara bersamaan oleh banyak user. Untuk itu diperlukan metodologi khusus yang menangani trafic agar terhindar dari tabrakan informasi yang menyebabkan informasi tidak berjalan sebagaimana mestinya.

Deleting

Jika sebuah record telah dihapus oleh seorang user (didalam tabel yang terdapat pada database server), dan user yang lain berusaha mengedit record tersebut (pada buffer recordsetnya), maka seharusnya ia akan mendapatkan pesan error untuk itu. Tetapi, tentu saja ini tergantung dari driver dan cursor type yang digunakan.

Jika kita telah mendapatkan pesan error tentang hal ini, maka mungkin kita ingin me-refresh kembali recordset tersebut. Tetapi dengan merefresh sebuah recordset dapat memberatkan beban kerja jaringan (network) dan tentu saja memperlambat kinerja aplikasi kita. Untuk itu ada beberapa macam “kontradiksi” ketika kita menangani hal ini:

Berikut ini adalah beberapa hal yang akan terjadi ketika kita berusaha menghapus sebuah record untuk Driver yang berbeda:

SQL Server Native  –  Kita tidak akan mendapatkan pessan error sama sekali

SQL Server ODBC –  akan terjadi Deadlock

Access OLE DB Provider  –  segera memberi peringatan jika kita akan menghapus dan mengedit sebuah record pada saat yang bersamaan!

Adding

Kita harus ingat, bahwa didalam aplikasi Multi-User, banyak user yang secara bersamaan memanipulasi sebuah data (baik itu menambah, menghapus ataupun merubah data). Kita haruslah selalu mempersiapkan penanganan masalah ini karena sangat mempengaruhi integritas data yang terdapat pada database server kita seperti yang kita diskusikan sebelumnya. Ketika kita menambah sebuah record pada suatu object recordset, user lain tidak akan melihat penambahan tersebut kecuali jika ia menggunakan Dynamic cursor. User tersebut  haruslah me-refresh kembali recordsetnya untuk melihat penambahan yang kita lakukan. Begitu juga sebaliknya.

Requery dan Resync

Ada 2 (dua) metode berbeda yang dapat kita gunakan untuk me-refresh kembali sebuah recordset. Metode Refresh( ) akan membentuk kembali semua isi dari recordset tersebut berdasarkan tabel/data yang dimintanya dari database server dengan menjalankan kembali perintah SQL untuk recordset tersebut. Metode Requery hanya akan me-refresh row-row tertentu saja yang kita inginkan. Sebagai contoh, kita dapat me-refresh data yang sedang diedit saja (current row) ataupun kesemua row (baris).

Checking Status Update Batch Locking

Jika salah satu dari data/row gagal di-update, maka kita dapat mencari tahu row yang gagal di-update tersebut. Untuk melakukan ini kita dapat menggunakan metode Filter yang terdapat didalam objek Recordset, passing sebuah konstanta spesial dan sebuah recordset baru yang berisi data yang gagal tersebut akan dibuat. Kita dapat memeriksa propertynya satu-per-satu untuk mencari tahu record/row mana yang gagal di-update.

Private Sub cmdCheck_Click()
    Dim oRS As Recordset
    Dim strSQL As String

    On Error Resume Next
  
    strSQL = “Select * FROM Karyawan Where Nama LIKE ‘S%'”

    ‘*** Gunakan Cursor Location = adUseClient

    Set oRS = New Recordset
    oRS.Open strSQL, oLogin.Connection, adOpenKeyset, adLockBatchOptimistic

    Do Until oRS.EOF
        Debug.Print oRS!Nama
      
        ‘Start Editing data
        oRS!Tanggal_Masuk = Now
        oRS!Status = 1
        oRS!Concurency_id = 2

        oRS!MoveNext
    Loop

    oRS.UpdateBatch

    ‘Kita dapat menggagalkannya dengan –> oRS.CancelBatch

    If Err.Number Then
        ‘Sekarang periksa statusnya
        Set oRS = oRS.Filter = adFilterAffectedRecords
        oRS.MoveFirst
        Do Until oRS.EOF
            Debug.Print oRS!Nama

            If oRS.Status <> adRecModified Then
                MsgBox “Record ini tidak ter-update: ” & oRS!Nama
            End If
            oRS.MoveNext    
        Loop
    End If

    oRS.Close
  
End Sub

 

Prepared Statements

Stored Procedure yang terdapat didalam database server adalah sebuah statement SQL yang sudah di-compiled oleh Database server tersebut (pre-compiled SQL Statement). Statement tersebut sudah dipersiapkan dan ditentukan rencana eksekusinya (Execution Plan) oleh database engine. Tetapi setiap database server mempunyai mekanisme yang berbeda dalam menangani stored procedure, sehingga tidak begitu portable.

Dengan menggunakan ODBC API, RDO dan ADO, kita dapat membuat sebuah prepared statements yang mensimulasikan sebuah stored procedure. Perpared statement adalah sebuah statement SQL yang dibuat oleh Visual Basic dan dikirimkan ke database server untuk di-compile dan dieksekusi. Tetapi statement tersebut tidak akan “dibuang” oleh database server sampai connection diputus. Prepared statement sangat cocok digunakan untuk meng-eksekusi perintah SQL yang sering digunakan didalam aplikasi.

Perbedaan waktu eksekusi

Sekarang marilah kita lihat perbedaan waktu yang diperlukan oleh sebuah perintah SQL biasa vs prepared statement.

Private Sub cmdTimings_Click()
    Dim cmdPrep As New Command
    Dim cmdNonPrep As New Command
    Dim connPrep As New Connection
    Dim connNonPrep As New Connection
   
    Dim strSQL As String
    Dim sngStart As Single
    Dim sngEnd As Single
    Dim intLoop As Integer

    Dim strConn As String

    strConn = “Provider = sqloledb” & _
                “;Data Source = (local)” & _
                “;Initial Catalog = Barang” & _
                “;User Id = sa” & tblOptions!UserID & _
                “;Password = xxx”

    Set connPrep = New ADODB.Connection
    Set connNonPrep = New ADODB.Connection

    Const conNumber As Integer = 100

    ‘Ingat: Gunakan 2 buah Connection yang berbeda untuk setiap statement
    ‘agar mendapatkan waktu yang akurat

    Screen.MousePointer = vbHourglass
    cmdTimings.Enabled = False

    strSQL = “Select * FROM tblBarang”

    ‘Membuat Non-Prepared Command Object
    connNonPrep.ConnectionString = strConn
    connNonPrep.Open
    With cmdNonPrep
        Set .ActiveConnection = connNonPrep
        .CommandText = strSQL
        .Prepared = False
    End With

    ‘Eksekusi SQL Statement (Looping) sebanyak 100 kali
    sngStart = Timer
    For intLoop = 1 To conNumber
        cmdNonPrep.Execute
    Next intLoop
    sngEnd = Timer
    msgBox “Waktu yang dibutuhkan adalah: ” & sngEnd – sngStart
    Set cmdNonPrep.ActiveConnection = Nothing
    Set cmdNonPrep = Nothing

    ‘Membuat Prepared Statements Command Object
    connPrep.ConnectionString = strConn
    connPrep.Open
    With cmdPrep
        Set .ActiveConnection = connPrep
        .CommandText = strSQL
        .Prepared = True
    End With

    ‘Eksekusi SQL Statement (Looping) sebanyak 100 kali
    sngStart = Timer
    For intLoop = 1 To conNumber
        cmdPrep.Execute
    Next intLoop
    sngEnd = Timer
    msgBox “Waktu yang dibutuhkan adalah: ” & sngEnd – sngStart
    Set cmdPrep.ActiveConnection = Nothing
    Set cmdPrep = Nothing

    Screen.MousePointer = vbDefault
    cmdTimings.Enabled = True

End Sub
‘—————- END OF CODE ———————————–
Dengan menentukan property “Prepared = True” dari object Command, maka database server akan membuat stored procedure sementara dan menjaganya sampai sebuah connection terjadi (aktif).

 

Cara Penggunaan Prepared Statement

Sekarang mari kita coba untuk mempelajari penggunaan prepared statement didalam aplikasi yang akan kita kembangkan.

Sebagai contoh kita akan mengambil data dari tabel <Barang> dengan kriteria Kode_Barang = 1234

‘Initialisasi Variabel pada awal form coding
Option Explicit

Dim oRS As Recordset
Dim mcmdFind As ADODB.Command

‘Command button untuk mengambil data barang
Private Sub cmdShowBarang_Click()
    ‘Periksa status Recordset
    If oRS.State = adStateOpen Then
        oRS.Close
    End If

    ‘Panggil prosedur untuk membentuk parameter prepared statement (pertama kali)
    If mcmdFind.CommandText = “” Then
        Call CmdFindBuild
    End If

    ‘Bound Recordset dengan informasi yang didapat dari prepared statement
    With mcmdFind
        .Parameters(“KodeBarang”) = txtKodeBarang.Text
        Set oRS = .Execute
    End With

    ‘Menampilkan nama barang
    If oRS.EOF Then 
        MsgBox “Data tidak ada”
    Else
        txtNama.Text = oRS!Nama_Barang
    End If
End Sub

Private Sub CmdFindBuild()
    Dim strSQL As String
    Dim oParam As ADODB.Parameter

    ‘membentukl statement SQL
    strSQL = “SELECT Nama_Barang FROM Barang ”
    strSQL = “WHERE Kode_Barang = ?”

    ‘building prepared statement
    With mcmdFind
        .CommandText = strSQL
        .Prepared = True
        .CommandType = adCmdText
        Set oParam = .CreateParameter(“KodeBarang”, adInteger, adParamInput, 4)
        .Parameters.Append oParam
        Set .ActiveConnection = goLogin.Connection
    End With

End Sub

Private Sub Form_Unload(Cancel As Integer)
    oRS.Close
    Set mcmdFind = Nothing
End Sub
‘—————- END OF CODE ———————————–
Untuk membuat suatu prepared statement, kita cukup membuat sebuah statement SQL biasa dengan satu atau beberapa parameter, kemudian mengirimkannya ke database melalui properti CommandText pada objek Command. Kita juga harus men-setting property ActiveConnection ke objek Connection yang sedang aktif dan property Prepared = True untuk menggunakan prepared statement.

Parameter dibentuk dengan menggunakan tanda “tanya” (?) untuk kriteria yang kita inginkan. Pada contoh listing diatas kita tanda tanya (?) berfungsi untuk menggantikan nilai Kode_Barang yang akan kita cari.
Untuk menggantikan parameter (?) pada statment SELECT, kita menggunakan koleksi Parameters untuk mengisi nilai yang kita inginkan. Parameter dimulai dari 0 dan bertambah 1 (satu) untuk setiap tanda tanya (?) yang dijumpai didalam SQL Statement. Jika kita menggunakan metode CreateParameter() maka kita dapat menentukan nama parameter yang kita pakai dibandingkan nilai dari posisinya.

Modifikasi Data dengan Prepared Statement

Prepared statement dapat juga kita gunakan untuk melakukan modifikasi terhadap data, INSERT, UPDATE dan DELETE Statement.

Sekarang marilah kita lihat contoh penggunaan INSERT dengan prepared statement:

Private Sub CmdAddBuild()
    Dim strSQL As String
    Dim oParam As ADODB.Parameter

    ‘Insert Statement for Tabel Barang
    strSQL = “INSERT INTO Barang(”
    strSQL = strSQL & “KodeBarang, ”
    strSQL = strSQL & “NamaBarang, ”
    strSQL = strSQL & “Harga ”
    strSQL = strSQL & “) VALUES (?, ?, ?)”

    With mcmdAdd
        .CommandText = strSQL
        .Prepared = True
        .CommandType = adCmdText

        Set oParam = .CreateParameter(“KodeBarang”, adInteger, adParamInput, 4)
        .Parameters.Append oParam

        Set oParam = .CreateParameter(“NamaBarang”, adChar, adParamInput, 100)
        .Parameters.Append oParam

        Set oParam = .CreateParameter(“Harga”, adCurrency, adParamInput, 8)
        .Parameters.Append oParam

        Set .ActiveConnection = goLogin.Connection
    End With
End Sub

‘—————- END OF CODE ———————————–
Didalam procedure CmdAddBuild() diatas dapat kita lihat statement INSERT dengan beberapa tanda tanya (?). Kita harus membuat satu buah tanda tanya untuk setiap parameter yang akan kita masukkan. Untuk setiap parameter, kita harus menspesifikasikan nama, datatype, ukuran data dan jenis input/output parameter tersebut.

Sedangkan untuk melakukan UPDATE data, kita akan membuat procedure yang hampir sama seperti statment INSERT:

Private Sub CmdUpdateBuild()
    Dim strSQL As String
    Dim oParam As ADODB.Parameter

    ‘Update Statement for Tabel Barang
    strSQL = “UPDATE Barang SET ”
    strSQL = strSQL & “NamaBarang = ?, ”
    strSQL = strSQL & “Harga = ? ”
    strSQL = strSQL & “WHERE KodeBarang = ?”

    With mcmdUpdate
        .CommandText = strSQL
        .Prepared = True
        .CommandType = adCmdText

        Set oParam = .CreateParameter(“NamaBarang”, adChar, adParamInput, 100)
        .Parameters.Append oParam

        Set oParam = .CreateParameter(“Harga”, adCurrency, adParamInput, 8)
        .Parameters.Append oParam

        Set oParam = .CreateParameter(“KodeBarang”, adInteger, adParamInput, 4)
        .Parameters.Append oParam

        Set .ActiveConnection = goLogin.Connection
    End With
End Sub

‘—————- END OF CODE ———————————–

Untuk menyimpan data menggunakan command object-command object diatas, maka kita harus mengisi setiap nilai parameter yang terdapat didalam procedure diatas, seperti:

Private Function FormAdd() As Boolean
    Dim lngRecords As Long

    On Error GoTo Error_EH

    If mcmdAdd.CommandText = “” Then
        Call CmdAddBuild
    End IF

    With mcmdAdd
        .Parameters(“KodeBarang”) = 12345
        .Parameters(“NamaBarang”) = “Buku Komputer”
        .Parameters(“Harga”) = 125000

        .Execute lngRecords
        If lngRecords = 0 Then
            Msgbox “Error adding record!”
            FormAdd = False
        Else
            FormAdd = True
        End If
    End With

    Exit Function

Error_EH:
    FormAdd = False
    MsgBox goLogin.ErrorHandler
    Exit Function
End Function

‘—————- END OF CODE ———————————–

Setelah mengisi setiap parameter yang terdapat didalam command object dengan nilai yang diinginkan, selanjutnya kita dapat menggunakan metode EXECUTE untuk mengeksekusi statement SQL (INSERT) yang kita inginkan. Kirimkan variabel lngRecords sebagai referensi apakah data yang kita masukkan berhasil ditambah (>1) atau tidak (=0).

Jangan lupa untuk menutup command object yang telah kita gunakan:

Private Sub Form_Unload(Cancel As Integer)
    oRS.Close

    Set mcmdFind = Nothing
    Set mcmdAdd = Nothing
    Set mcmdUpdate = Nothing
End Sub
‘—————- END OF CODE ———————————–

Command Objects dan Stored Procedures

Ada 2 macam metode yang digunakan untuk memanggil stored procedures pada ADO. Kita dapat menggunakan syntax pemanggilan yang terdapat didalam ODBC, atau dengan mempergunakan ‘command object’. Dibawah ini adalah syntax untuk membangun sebuah Recordset langsung dari syntax pemanggilan ODBC.

Private Sub cmdRS_Click()
    Dim oRS As New ADODB.Recordset
    Dim strSQL As String

    ‘Build SQL for loading list box
    strSQL = “EXEC procViewBarang”

    oRS.Open strSQL, goLogin.Connection, _
             adOpenForwardOnly, _
             adLockReadOnly, _
             adCmdStoredProc

    Do Until oRS.EOF
        With lstBarang
            .AddItem oRS!Kode_Barang & “, ” & oRS!Nama_Barang
            .ItemData(.NewIndex) = oRS!ID_Barang
        End With
       
        oRS.MoveNext
    Loop
   
    oRS.Close
End Sub

‘—————- END OF CODE ———————————–
Sedangkan metode ke-dua adalah dengan menggunakan Command Object:

Private Sub cmdCommand_Click()
    Dim oCmd As New ADODB.Command
    Dim oRS As New ADODB.Recordset

    ‘Build Command Object
    With oCmd
        Set .ActiveConnection = goLogin.Connection
        .CommandType = adCmdStoredProc
        .CommandText = “procViewBarang”
        .Parameters.Append .CreateParameter(“Kode_Barang”, adChar, adParamInput, 10)
        .Parameters(“Kode_Barang”).Value = txtKodeBarang.Text
    End With

    Set oRS = oCmd.Execute

    Do Until oRS.EOF
        With lstBarang
            .AddItem oRS!Kode_Barang & “, ” & oRS!Nama_Barang
            .ItemData(.NewIndex) = oRS!ID_Barang
        End With
       
        oRS.MoveNext
    Loop
   
    oRS.Close   
End Sub

‘—————- END OF CODE ———————————–
SUMMARY

Pada chapter ini kita telah mempelajari bagaimana cara menggunakan Command Object yang dikombinasikan dengan Stored Procedures. Kita belajar bagaimana caranya mem-passing parameter kedalam sebuah command object dan juga bagaimana membuat sebuah ‘temporary’ stored procedures.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: