ฉันต้องการลบข้อยกเว้นเดียวกันใน SQL Server ที่เพิ่งเกิดขึ้นในบล็อกลองของฉัน ฉันสามารถส่งข้อความเดียวกันได้ แต่ฉันต้องการแสดงข้อผิดพลาดเดียวกัน
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);
บรรทัดนี้จะแสดงข้อผิดพลาด แต่ฉันต้องการฟังก์ชันแบบนั้น นี้ทำให้เกิดข้อผิดพลาดที่มีจำนวนข้อผิดพลาด 50000 แต่ฉันต้องการหมายเลขข้อผิดพลาดจะถูกโยนว่าผมผ่าน@@error
,
ฉันต้องการจับข้อผิดพลาดนี้ไม่ที่ส่วนหน้า
กล่าวคือ
catch (SqlException ex)
{
if ex.number==2627
MessageBox.show("Duplicate value cannot be inserted");
}
ฉันต้องการฟังก์ชันนี้ ซึ่งไม่สามารถทำได้โดยใช้raiseerror
. ฉันไม่ต้องการให้ข้อความแสดงข้อผิดพลาดที่กำหนดเองที่ส่วนหลัง
RAISEERROR
ควรส่งคืนข้อผิดพลาดที่กล่าวถึงด้านล่างเมื่อฉันผ่าน ErrorNo ที่จะถูกโยนเข้าจับ
Msg 2627, Level 14, State 1, Procedure spOTest_DomainInsert,
บรรทัดที่ 14 การละเมิดข้อ จำกัด UNIQUE KEY 'UK_DomainCode' ไม่สามารถแทรกคีย์ที่ซ้ำกันในออบเจ็กต์ 'Tags.tblDomain' คำสั่งยุติแล้ว
แก้ไข:
อะไรคือข้อเสียเปรียบของการไม่ใช้ try catch block หากฉันต้องการให้มีการจัดการข้อยกเว้นที่ส่วนหน้าโดยพิจารณาจากขั้นตอนการจัดเก็บที่มีแบบสอบถามหลายรายการที่ต้องดำเนินการ
raiserror
นั้นซึ่งแตกต่างจากวิธีที่ c # ออกหลังจากไฟล์throw
. ดังนั้นฉันจึงเพิ่มreturn
ภายในcatch
เพราะฉันต้องการให้ตรงกับพฤติกรรมนั้น