2011-06-26 24 views
57

Tôi cần bắt vi phạm các ràng buộc UNIQUE một cách đặc biệt bằng ứng dụng C# mà tôi đang phát triển. Có an toàn để giả định rằng Error 2627 sẽ luôn tương ứng với vi phạm loại này, để tôi có thể sử dụngVi phạm khóa duy nhất trong SQL Server - Có an toàn để giả sử Lỗi 2627 không?

if (ThisSqlException.Number == 2627) 
{ 
    // Handle unique constraint violation. 
} 
else 
{ 
    // Handle the remaing errors. 
} 

?

Trả lời

98

2627 là hạn chế duy nhất (bao gồm khóa chính), 2601 là chỉ số duy nhất

SELECT * FROM sys.messages 
WHERE text like '%duplicate%' and text like '%key%' and language_id = 1033 
+1

+1 để bao gồm SQL –

+0

@gbn Sự khác biệt giữa ràng buộc duy nhất và chỉ mục duy nhất là gì? Không thực thi cả hai chỉ số? – xameeramir

+0

https://technet.microsoft.com/en-us/library/aa224827(v=sql.80).aspx - Tóm lại, chúng tôi có thể kết luận một cách an toàn rằng không có sự khác biệt thực tế giữa ràng buộc duy nhất và chỉ mục duy nhất khác với thực tế là ràng buộc duy nhất cũng được liệt kê như một đối tượng ràng buộc trong cơ sở dữ liệu. – bfhd

3

Trong khoảng gần đúng, có.

Nếu bạn tìm kiếm lỗi MS và trang web sự kiện cho SQL Server, lỗi 2627, bạn hy vọng sẽ đạt được this page, cho biết rằng thư sẽ luôn liên quan đến vi phạm khóa trùng lặp (lưu ý phần nào được tham số hóa và không):

Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'. 
+0

Ý bạn là gì "trong một xấp xỉ"? – User

+0

@Người dùng - tất cả những gì tôi muốn nói là tôi không thể nghĩ ra bất cứ điều gì khác sẽ khiếu nại về các khóa trùng lặp, nhưng thông báo không may được tham số hóa theo loại ràng buộc. –

11

Dưới đây là một phương pháp mở rộng tiện dụng tôi đã viết để tìm những:

public static bool IsUniqueKeyViolation(this SqlException ex) 
    { 
     return ex.Errors.Cast<SqlError>().Any(e => e.Class == 14 && (e.Number == 2601 || e.Number == 2627)); 
    } 
Các vấn đề liên quan