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:
Posting Komentar