Anda di halaman 1dari 7

© 2017 mztolo.

com / contoh 10

.NET Contoh 10

Try – Catch / Mengelola Transaksi


Copy WebApp008 ke WebApp009, selanjutnya kita akan terapkan Try - Catch.

Publish WebApp009 ke localhost/SMA212 (Visual Studio Community 2017 run as administrator)

Jalankan aplikasi di 2 web browser secara bersamaan, misal di IE dan Firefox.

Di IE coba lakukan proses ubah data siswa yg ada, spt ini.

Nama Siswa yg dulunya “Tini” menjadi “Tini Jane”.

Di Firefox dengan data yg sama lakukanlah proses hapus, spt ini.

Page 1 of 7
© 2017 mztolo.com / contoh 10

Masih di Firefox, pastikan data siswa tsb sudah terhapus.

Kembali ke IE, setelah Anda ubah coba simpan data tsb.

Karena data tsb sudah terhapus maka ketika dilakukan tindakan simpan di web browser lain akan timbul
pesan error spt ini.

Server Error in '/SMA212' Application.

Store update, insert, or delete statement affected an unexpected number of rows


(0). Entities may have been modified or deleted since entities were loaded. See
http://go.microsoft.com/fwlink/?LinkId=472540 for information on understanding
and handling optimistic concurrency exceptions.

Sekarang mari kita terapkan try – catch di controllernya.

Buka Controllers\SiswaController.cs dan ubah method Edit menjadi spt ini.


// POST: Siswa/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ID,NamaSiswa,KelasSiswa")] Siswa siswa)
{
try
{
if (ModelState.IsValid)
{
db.Entry(siswa).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
}
catch (DataException)
{

Page 2 of 7
© 2017 mztolo.com / contoh 10

ModelState.AddModelError("", "Simpan Data Gagal. Coba lagi, jika masih


gagal hub DB Admin.");
}
return View(siswa);
}

Publish lagi dan jalankan di 2 web browser.

Sekarang coba dengan data yg lain spt langkah di atas, dan ketika dilakukan perintah simpan akan tampil
pesan error spt di bawah ini, (lebih manusiawi).

Dan benar ketika Anda “Kembali ke Daftar”, Siswa dengan nama “Tolo” memang tdk ada, alias sudah
ada yg menghapus.

Page 3 of 7
© 2017 mztolo.com / contoh 10

Ubah juga Controllers\SiswaController.cs di method Create spt ini.


// POST: Siswa/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "NamaSiswa,KelasSiswa")] Siswa siswa)
{
try
{
if (ModelState.IsValid)
{
db.Siswas.Add(siswa);
db.SaveChanges();
return RedirectToAction("Index");
}
}
catch (DataException)
{
ModelState.AddModelError("", " Simpan Data Gagal. Coba lagi, jika masih
gagal hub DB Admin.");
}
return View(siswa);
}

Penjelasannya :

Method Create ini mirip dengan method Edit di atas, hanya bedanya kolom ID tdk disertakan di binding
datanya.

Hal ini dikarenakan ID akan otomatis terisi pada saat create data pertama kali.

Bind disini berfungsi sbg filter kolom apa saja yg akan di gunakan dlm proses edit atau create data, dan
memprotek dari usaha-usaha yg dikenal sbg “over-posting” yaitu menambahkan passing data lewat
parameter link web browser.

CSRF pernah dengar ? Cross Site Request Forgery atau bahasa mudahnya aksi pemalsuan
token/tanda/penanda/petunjuk dlm request data di web browser.

Anda pasti tahu maksud link ini : http://localhost/SMA212/Siswa/Details/3 yaitu menampilkan detail
data Siswa dgn ID no 3.

Pada dasarnya link web aplikasi rentan terhadap usaha hacking, yg antara lain dgn metode CSRF tsb.

Untuk mengatasi hal tsb dipakailah fungsi [ValidateAntiForgeryToken]

Dan untuk lebih detil serta bagaimana CSRF bekerja silahkan googling sendiri ya.

Saya lemah diteori.....dan praktek hehehe.

Tambahan :

Untuk method Index dan Details tdk ada perubahan dan masih sama dengan koding sebelumnya.

Page 4 of 7
© 2017 mztolo.com / contoh 10

Ubah juga Controllers\SiswaController.cs method Delete menjadi spt ini.


// GET: Siswa/Delete/5
public ActionResult Delete(int? id, bool? saveChangesError = false)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
if (saveChangesError.GetValueOrDefault())
{
ViewBag.ErrorMessage = "Hapus Data Gagal. Coba lagi, Jika masih gagal hub
DB Admin.";
}
Siswa siswa = db.Siswas.Find(id);
if (siswa == null)
{
return HttpNotFound();
}
return View(siswa);
}

// POST: Siswa/Delete/5
//[HttpPost, ActionName("Delete")]
[HttpPost]
[ValidateAntiForgeryToken]
//public ActionResult DeleteConfirmed(int id)
public ActionResult Delete(int id)
{
try
{
Siswa siswa = db.Siswas.Find(id);
db.Siswas.Remove(siswa);
db.SaveChanges();
}
catch (DataException)
{
return RedirectToAction("Delete", new { id = id, saveChangesError = true });
}
return RedirectToAction("Index");
}

Tambahkan juga skrip berikut ke Views\Siswa\Create.cshtml. (untuk menampilkan pesan error di view)
<h2>Hapus Data</h2>
<p class="error">@ViewBag.ErrorMessage</p>
<h3>Yakin mau menghapus data ini ?</h3>

Page 5 of 7
© 2017 mztolo.com / contoh 10

Penjelasan :

Pada saat user melakukan proses hapus, parameter saveChangesError = false awalnya.

Ketika proses error saveChangesError = true dan pesan ViewBags.ErrorMessage akan ditampilkan di
view.

Selanjutnya user diberikan kesempatan lagi untuk menghapus atau kembali ke daftar Siswa.

Jika Anda perhatikan di method Create, Delete dan Edit atau Update membutuhkan 2 metode tindakan.

Metode pertama GET, memberikan pengguna kesempatan untuk menyetujui atau membatalkan operasi
hapus/ubah/buat baru.

Jika pengguna menyetujuinya, permintaan POST dibuat. Ketika itu terjadi, metode HttpPost pun di
jalankan dan dan kemudian operasi hapus/ubah/buat baru benar-benar dilakukan.

Nama method untuk proses GET dan POST di framework MVC ini boleh sama, dan hal ini justru bagus
karena mengurangi beban atau overloads nama parameter yg dipakai oleh CLR (Common Language
Runtime yaitu komponen virtual mesin .Net yg bertugas menjalankan eksekusi dari aplikasi).

Fungsi try – catch sendiri berguna untuk menangani setiap kesalahan yang mungkin terjadi ketika
database diperbarui.

Jika terjadi kesalahan, metode HttpPost memanggil metode HttpGet, dan passing parameter yang
menunjukkan bahwa kesalahan telah terjadi.

Metode HttpGet kemudian re-display halaman konfirmasi bersama dengan pesan kesalahan, dan
memberikan pengguna kesempatan untuk membatalkan atau mencoba lagi.

Ok, jalankan aplikasi di 2 web browser, hapus data Siswa di salah satu web browser.

Selanjutnya di web browser yg lain hapus juga.

Karena data tidak ada (sudah dihapus di web browser lain) maka procedure ini yg akan dijalankan.
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}

Tampilan error message di web browser nya spt ini.

Page 6 of 7
© 2017 mztolo.com / contoh 10

Tambahan :

Perhatikan koding di bagian class controller Anda.

Terdapat skrip berikut ini : (untuk menyambung ke database)


private Koneksi db = new Koneksi();

dan ini... (untuk memutus koneksi ke database serta clear resources)

protected override void Dispose(bool disposing)


{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}

Ini sama atau mirip yg ada di VFP :

n=SQLSTRINGCONNECT(a)

dan...

x=SQLDISCONNECT(n)

Terima kasih
Demikian contoh pemakaian try – catch untuk menghandle transaksi.

Jaga perdamaian dan hindari anarkisme, suka .net bukan alasan ntuk membenci bhs program yg lain.

Karena perbedaan itu keniscayaan dan justru jadi alasan kita ntuk lebih saling mengenal.

Mari jaga dan sebarkan semangat kebersamaan.

Semoga berguna dan tetap semangat.

Terima kasih.

Page 7 of 7

Anda mungkin juga menyukai