Kamis, 22 Januari 2009

ADO.Net Transaction, Untuk Penyimpanan pada Tabel Master/Detail

PRA KATA...
Pada saat membuat program terutama untuk aplikasi database, seringkali kita dihadapkan pada model penyimpanan master/detail atau header/detail. contoh nya pada kasus Order pembelian, penerimaan barang dan masih banyak lagi. tekhnik penyimpanannya sebenarnya bisa dilakukan dengan menyimpan headernya terlebih dahulu, baru kemudian kita tambahkan detailnya satu per satu, akan tetapi ada kalanya kita dihadapkan pada situasi bahwa data yang di masukan harus sukses tersimpan semuanya.. jika ada kesalahan.. entah yg disebabkan terputusnya koneksi secara tiba2 atau hal lainnya, maka data tersebut tidak boleh tersimpan hanya sebagian saja. Nah untuk situasi semacam ini memanfaatkan fungsi transaction pada SQLconnection menjadi perlu. untuk tujuan tersebutlah tulisan ini dibuat... ini hasil explorasi ku aja.. kalo ada yang lebih baik lagi tekhniknya boleh dong di sharing.. :)

STARTING..
Pada kasus ini saya menggunakan database SQLServer dg nama database test dan dua buah tabel TrsH sebagai tabel headernya dg field sbb (NoTrs Varchar(64), Desk Varchar(80) ) dan tabel TrsD sebagai tabel detailnya dg Field sbb (ID Smallint, NoTrs Varchar(64), Qty Smallint). Oleh karenanya jika ingin mencoba maka harus membuat database dan tabel-tabel tersebut.

Kemudian buatlah sebuah project baru dan tambahkan sebuah button pada form yang ada. dan kopikan code program berikut ini atau bisa juga download contoh program yg saya buat di sini 

Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlClient
Imports System.Data.SqlTypes

Public Class Form1

    'Procedure berikut ini untuk simulasi memasukan data ke Database pada SQL Server
    'Dengan memanfaat fungsi Begintrans dan Commit Trans.
    'Hal kadang diperlukan pada transaksi yg mengharuskan bahwa penyimpanan pada tabel master/detail harus 
    'sukses semuanya, jika gagal pada salah satu prosesnya, maka data yg ditambahkan tersebut tidak boleh tersimpan semuanya
    Private Sub saveToDb()

        Dim MyConn As SqlConnection
        Dim TheTransaction As SqlTransaction
        Dim myCmd4Trsh As SqlCommand
        Dim myCmd4Trsd As SqlCommand

        Dim MyTrsHNo As String = "001"
        Dim MyTrsHDesc As String = "Ini Cuma test aja"
        Dim NoDtl As Integer = 0
        Dim Qty As Integer = 0

        Try
            'Prepare connection & set transcation, so every connection to SQL Server using this connection
            'will use the same transaction
            MyConn = New SqlConnection
            MyConn.ConnectionString = "Data Source=(local);Initial Catalog=test;Persist Security Info=True;User ID=sa;Password=123"
            MyConn.Open()
            'Memulai transaksi
            TheTransaction = MyConn.BeginTransaction

            myCmd4Trsh = New SqlCommand
            myCmd4Trsh.Connection = MyConn
            myCmd4Trsh.CommandType = CommandType.StoredProcedure
            myCmd4Trsh.CommandText = "ADD_TrsH"
            myCmd4Trsh.Transaction = TheTransaction

            'Tambahkan parameter untuk SP AddTrsH dan Set value ke parameter tersebut
            myCmd4Trsh.Parameters.Add("@NoTrs", SqlDbType.VarChar, 64).Value = MyTrsHNo
            myCmd4Trsh.Parameters.Add("@Desk", SqlDbType.VarChar, 80).Value = MyTrsHDesc
            myCmd4Trsh.ExecuteNonQuery()

            myCmd4Trsd = New SqlCommand
            myCmd4Trsd.Connection = MyConn
            myCmd4Trsd.CommandType = CommandType.StoredProcedure
            myCmd4Trsd.CommandText = "ADD_TrsD"
            myCmd4Trsd.Transaction = TheTransaction

            Dim i As Integer = 0
            For i = 0 To 4
                myCmd4Trsd.Parameters.Add("@ID", SqlDbType.SmallInt).Value = i
                myCmd4Trsd.Parameters.Add("@NoTrs", SqlDbType.VarChar, 64).Value = MyTrsHNo
                myCmd4Trsd.Parameters.Add("@Qty", SqlDbType.Int).Value = i + 10
                myCmd4Trsd.ExecuteNonQuery()
                myCmd4Trsd.Parameters.Clear()
            Next
            'jika proses menambahkan data pada tabel TrsH dan TrsD sukes maka lakukan Commit, untuk menyimpan data
            'secara permanen didatabase
            TheTransaction.Commit()

        Catch ex As Exception
            MessageBox.Show(ex.Message, "", MessageBoxButtons.OK)
            'jika proses menambahkan data pada tabel TrsH dan TrsD Gagal maka lakukan RollBack, agar data tidak disimpan
            'didatabase
            TheTransaction.Rollback()
            MyConn.Close()
        Finally
            MyConn.Close()
        End Try

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Call saveToDb()
    End Sub
End Class

FINALLY...
Ok selesai sudah.. selamat mencoba, semoga berguna... thank's

Tidak ada komentar: