Blue Spy's M*******t Area

Just another place to share..

June 2010 - Posts

Constraint Error akibat @@ROWCOUNT

Beberapa hari ini ngebantuin temen buat suatu aplikasi. Pada databasenya tidak menggunakan identity untuk primary key-nya karena bertipe data karakter. Akhirnya terpaksa menggunakan Function buatan. Setelah 10 menit berlalu, fungsi tersebut telah berjalan dengan sukses. Dan masalah pun selesai.   (ternyata hanya sesaat)

Keesokan harinya, ketika dicoba kembali menjalankan aplikasi tersebut, ternyata muncul error. Setelah melakukan investigasi, ternyata tabel yang diisi kosong (tabel tersebut di-truncate), sementara ketika pembuatan fungsi kemarin tidak mempertimbangkan hal tersebut, alhasil error. (Kecerobohan pertama nih.. smile_embaressed ) Karena masalahnya jelas, gak pakai pikir panjang, langsung saja fungsi tersebut ku ubah agar bisa tetap berjalan sebagaimana mestinya. Dan masalah pun kembali selesai. (lebih sesaat lagi)

Gak sampai 10 menit kemudian, error baru muncul. Kali ini, error yang terjadi ialah constraint error akibat duplicate value pada primary key. Nah lho.. Harusnya gak mungkin salah, kecuali kalau ada logical error. Karena yakin, pada fungsi tersebut tidak terdapat logical error, q coba jalankan fungsi tersebut pada SQL Server Management Studio, dan hasilnya memang sesuai seperti yang diharapkan. Tidak terdapat error yang terjadi ketika dijalankan melalui aplikasi.

Mulailah pencarian dilakukan dengan bantuan om google. Dan akhirnya kecewa juga sama hasil pencariannya.   Hasil pencarian tersebut tidak membuahkan hasil. Akhirnya, q coba menjalankan fungsi tersebut dalam query lain, query yang q anggap mirip seperti dijalankannya dalam aplikasi, dan akhirnya (yess..) errornya muncul. Setelah melihat error tersebut, akhirnya ketauan juga kalau errornya terletak pada perhitungan jumlah record yang dihasilkan oleh query. Dalam hal ini, perhitungan jumlah baris tersebut dipercayakan pada @@ROWCOUNT yang memang fungsinya untuk mengembalikan jumlah record yang dihasilkan oleh query yang dieksekusi sebelumnya. (Di sinilah kecerobohan kedua..  ). Ternyata @@ROWCOUNT menyimpan jumlah record pada query yang dieksekusi sebelum fungsi dipanggil, dalam hal ini, harusnya @@ROWCOUNT menyimpan jumlah record pada query yang terdapat dalam fungsi. Karena, hal tersebut tidak diinginkan akhirnya dilakukan perubahan (lagi) dengan membuat perhitungan sendiri. Dan akhirnya masalah pun (benar-benar) selesai.

 

Moral cerita: Bacalah dokumentasi dengan sangat-sangat baik, karena sebenarnya penjelasannya sudah ada dalam dokumentasi.