Dalam membangun aplikasi multi client (server client) ada beberapa hal yang menjadi permasalahan dasar, yaitu generate NoUrut/Bukti. Kenapa? Saya ambil contoh 1 server + database dan 2 client. Misalkan mau input transaksi penjualan dengan format nourut/bukti PJLyyyy-xxxx. Pada saat bersamaan client 1 dan client 2 menekan tombol New (Baru). sehingga pada komputer masing masing client muncul PJL2013-0001 (misalnya). Nah begitu data disimpan, baik itu secara bersamaan maupun tidak (misal client 1 terlebih dulu menekan tombol save (simpan)), itu salah satu pasti akan muncul error :
"Violation of PRIMARY KEY constraint 'PK_djiesoft_trans'. Cannot insert duplicate key in object 'dbo.djiesoft_trans'"
Kenapa salah satu client akan muncul error tersebut? kenapa tidak kedua client? seberanya TIDAK ADA
data yang di insert secara bersamaan (Pasti di data transport TCP/IP akan terjadi queue (antrian)), jadi walaupun telihat client 1 dan 2 menekan tombol save/simpan secara bersamaan, secara system itu akan tetap terjadi queue/antrian walau hanya berbeda beberapa mili second/detik saja dan siapa yang lebih dahulu sampai/masuk ke database, dia yang akan tersimpan datanya, sisanya akan error. SO, bagaimana cara memecahkan masalah ini ?
data yang di insert secara bersamaan (Pasti di data transport TCP/IP akan terjadi queue (antrian)), jadi walaupun telihat client 1 dan 2 menekan tombol save/simpan secara bersamaan, secara system itu akan tetap terjadi queue/antrian walau hanya berbeda beberapa mili second/detik saja dan siapa yang lebih dahulu sampai/masuk ke database, dia yang akan tersimpan datanya, sisanya akan error. SO, bagaimana cara memecahkan masalah ini ?
Ada beberapa cara yang dapat dilakukan, salah satu yang biasa saya lakukan adalah dengan menggunakan error handler. berikut ini contoh sintak pada tombol simpan :
Private Sub btn_simpan_Click(ByValsender As System.Object, ByVal e AsSystem.EventArgs) Handles btn_simpan.Click
DoTryInsert:
Try
'cek/generate ulang nourut/nobukti sebelum insert
myBukti = djie_generate_bukti()
Usingdjie_con As NewSqlClient.SqlConnection(djie_constring)
djie_con.Open()
Usingdjie_cmd As NewSqlClient.SqlCommand(String.Format("INSERT INTO djiesoft_trans VALUES ({0},{1})", myBukti, "getdate()"), djie_con)
djie_cmd.ExecuteNonQuery()
EndUsing
EndUsing
Catchex As Exception
SelectCase Err.Number.ToString + Mid(Err.Description, 1, 35)
Case"5Violation of PRIMARY KEY constraint"'duplicate
GoToDoTryInsert
CaseElse
MessageBox.Show(Err.Number.ToString + " : " + Err.Description, "DJIESOFT_ERR", MessageBoxButtons.OK, MessageBoxIcon.Error)
EndSelect
End Try
End Sub
Jadi saat client 1 sedang melakukan insert data, client 2 akan terus mengalami error, namun tidak ditampilkan error karena di tangkap oleh :
Catchex As Exception
SelectCase Err.Number.ToString + Mid(Err.Description, 1, 35)
Case"5Violation of PRIMARY KEY constraint"'duplicate
GoToDoTryInsert
yang kemudian akan mengulangi proses simpan (ke atas) dengan dengan perintah GoTo DoTryInsert. jika client 1 sudah berhasil simpan data maka client 2 pun akan dapat menyimpan data. jika anda mempunyai ide/saran yang lain, boleh berkomentar dibawah. Selamat mencoba ...
Tags:
error saat simpan data, solusi duplicate saat simpan data, multi client insert data, client server arsitektur, menggunakan error handler untuk simpan data multi client, generate nobukti saat simpan data
0 komentar:
Posting Komentar