2010-10-19 34 views
22

Tôi đang cố gắng loại trừ ngoại lệ khi tôi chèn một người dùng đã tồn tại với tên người dùng đã cho vào cơ sở dữ liệu của tôi. Như tiêu đề nói sau đó tôi đang sử dụng EF. Ngoại lệ duy nhất được ném khi tôi cố gắng chèn người dùng vào db là một "UpdateException" - Làm thế nào tôi có thể trích xuất ngoại lệ này để xác định xem một ngoại lệ trùng lặp của nó hay cái gì khác?Ngoại lệ khóa trùng lặp từ Khuôn khổ thực thể?

+0

như với bất kỳ ngoại lệ, nhìn vào InnerException để tìm hiểu các chi tiết lỗi chính xác. – RPM1984

Trả lời

34

Đặt số chính xác tại ?????? tương ứng với vi phạm ràng buộc duy nhất (Tôi không biết nó từ đầu của tôi).

+0

Perfect :) - Tuy nhiên .. Tôi chỉ cố gắng để nắm bắt các ErrorCode và nó nói rằng mã lỗi cho một mục trùng lặp là-2146232060 mà có vẻ hơi lạ với tôi? – ebb

+0

Lỗi của tôi .. đã sử dụng errorCode thay thế. Cảm ơn :) – ebb

+9

Để tham khảo trong tương lai: [2601] (http://msdn.microsoft.com/en-us/library/aa258747 (v = sql.80) .aspx) là một vi phạm ràng buộc duy nhất (đối với SQL Server). – kamranicus

11

Bây giờ trong C# 6.0 bạn sẽ có thể làm điều gì đó như thế này:

catch (UpdateException ex) when ((ex.InnerException as SqlException)?.Number == ??????) 
{ 
    // Handle exception here 
} 
10

Bởi vì tôi đang sử dụng EntityFramework với C#, tôi đã phải thực hiện một thay đổi nhỏ này - hy vọng nó sẽ giúp mọi người .. .

try 
{ 
    await db.SaveChangesAsync(); 
} 
catch (DbUpdateException ex) 
{ 
    SqlException innerException = ex.InnerException.InnerException as SqlException; 
    if (innerException != null && (innerException.Number == 2627 || innerException.Number == 2601)) 
    { 
     //your handling stuff 
    } 
    else 
    { 
     throw; 
    } 
} 

vấn đề của tôi đã về vì tôi cần DbUpdateException thay vì UpdateException, và đối tượng InnerException tôi đã có một đối tượng InnerException bổ sung mà chứa số tôi cần ...

+0

Cảm ơn, điều này rất hữu ích! Tôi sẽ sử dụng điều này, nhưng với một kiểm tra null thêm trên dòng 7; như được viết, khối catch sẽ ném NullReferenceException nếu ex.InnerException (tức là InnerException lồng nhau đầu tiên) là null. –

0

Tôi nghĩ rằng nó tốt hơn nếu bạn ngăn chặn ngoại lệ xảy ra. Nếu có thể với mã của bạn, tôi sẽ làm như sau:

Khi sử dụng khung thực thể, điều tốt nhất cần làm là trước tiên hãy thử và nhận được mục nhập sẽ gây ra rắc rối cho bạn với SingleUnDefault của LINQ. Bây giờ bạn có thể cập nhật thực thể đã nhận với cá thể mà bạn muốn chèn, giữ cho bạn một số ID với tự động tăng nếu bạn sử dụng nó. Nếu SingleOrDefault là null, bạn có thể thêm thực thể của mình một cách an toàn.

ví dụ về mã:

public override void AddOrUpdate(CustomCaseSearchCriteria entity) 
    { 
     var duplicateEntityCheck = GetSingleByUniqueConstraint(entity.UserCode, entity.FilterName); 
     if (duplicateEntityCheck != null) 
     { 
      duplicateEntityCheck.Overwrite(entity); 
      base.Update(duplicateEntityCheck); 
     } 
     else 
      base.Add(entity); 
    } 

    public virtual CustomCaseSearchCriteria GetSingleByUniqueConstraint(string userCode, string filterName) 
    { 
     return GetAllInternal().SingleOrDefault(sc => sc.UserCode == userCode && sc.FilterName == filterName); 
    } 
Các vấn đề liên quan