Saya ingin menampilkan kembali pengecualian yang sama di SQL Server yang baru saja terjadi di blok percobaan saya. Saya dapat memberikan pesan yang sama tetapi saya ingin memberikan kesalahan yang sama.
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO Tags.tblDomain (DomainName, SubDomainId, DomainCode, Description)
VALUES(@DomainName, @SubDomainId, @DomainCode, @Description)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
declare @severity int;
declare @state int;
select @severity=error_severity(), @state=error_state();
RAISERROR(@@Error,@ErrorSeverity,@state);
ROLLBACK TRANSACTION
END CATCH
RAISERROR(@@Error, @ErrorSeverity, @state);
Baris ini akan menunjukkan kesalahan, tetapi saya ingin fungsionalitas seperti itu. Ini menimbulkan kesalahan dengan nomor kesalahan 50000, tetapi saya ingin nomor kesalahan dilemparkan yang saya lewati @@error
,
Saya ingin menangkap kesalahan ini tidak di bagian depan.
yaitu
catch (SqlException ex)
{
if ex.number==2627
MessageBox.show("Duplicate value cannot be inserted");
}
Saya ingin fungsi ini. yang tidak dapat dicapai dengan menggunakanraiseerror
. Saya tidak ingin memberikan pesan kesalahan khusus di bagian belakang.
RAISEERROR
harus mengembalikan kesalahan yang disebutkan di bawah ini ketika saya melewati ErrorNo untuk dilempar ke dalam tangkapan
Msg 2627, Level 14, State 1, Procedure spOTest_DomainInsert,
Baris 14 Pelanggaran batasan UNIQUE KEY 'UK_DomainCode'. Tidak dapat memasukkan kunci duplikat dalam objek 'Tags.tblDomain'. Pernyataan tersebut telah dihentikan.
EDIT:
Apa yang bisa menjadi kekurangan dari tidak menggunakan blok try catch jika saya ingin pengecualian ditangani di frontend mengingat prosedur tersimpan berisi banyak kueri yang perlu dijalankan?
raiserror
, yang berbeda dari bagaimana c # keluar setelah athrow
. Jadi saya menambahkan bagianreturn
dalamcatch
karena saya ingin mencocokkan perilaku itu.