2008-09-26 25 views
31

Làm cách nào để tìm ra cột và giá trị nào vi phạm ràng buộc? Thông báo ngoại lệ không hữu ích chút nào:Những yếu tố gây nên Hạn chế ngoại lệ khi tải Tập dữ liệu?

Không thể bật các ràng buộc. Một hoặc hàng khác chứa các giá trị vi phạm các khóa không hạn chế, độc nhất hoặc ngoài nước .

+2

tôi muốn cung cấp cho bạn nhiều up-phiếu nếu tôi có thể. Đây là một cái gai ở bên cạnh tôi. –

Trả lời

20

Giống như nhiều người, tôi có thành phần truy cập dữ liệu tiêu chuẩn của riêng tôi, trong đó bao gồm phương pháp để trả về một DataSet. Tất nhiên, nếu một ConstraintException được ném, DataSet không được trả lại cho người gọi, vì vậy người gọi không thể kiểm tra lỗi hàng.

Những gì tôi đã làm là nắm bắt và rethrow ConstraintException trong các phương pháp như vậy, đăng nhập chi tiết lỗi liên tiếp, như trong ví dụ sau đây (trong đó sử dụng Log4Net cho khai thác gỗ):

... 
try 
{ 
    adapter.Fill(dataTable); // or dataSet 
} 
catch (ConstraintException) 
{ 
    LogErrors(dataTable); 
    throw; 
} 
... 

private static void LogErrors(DataSet dataSet) 
{ 
    foreach (DataTable dataTable in dataSet.Tables) 
    { 
     LogErrors(dataTable); 
    } 
} 

private static void LogErrors(DataTable dataTable) 
{ 
    if (!dataTable.HasErrors) return; 
    StringBuilder sb = new StringBuilder(); 
    sb.AppendFormat(
     CultureInfo.CurrentCulture, 
     "ConstraintException while filling {0}", 
     dataTable.TableName); 
    DataRow[] errorRows = dataTable.GetErrors(); 
    for (int i = 0; (i < MAX_ERRORS_TO_LOG) && (i < errorRows.Length); i++) 
    { 
     sb.AppendLine(); 
     sb.Append(errorRows[i].RowError); 
    } 
    _logger.Error(sb.ToString()); 
} 
+0

Phương pháp LogErrors của bạn thật tuyệt vời! Theo nghĩa đen đã cứu tôi ngày hôm nay. – Dave

1

tôi đã thêm một số mã mà tôi đã thấy hữu ích khi gỡ lỗi các lần xuất hiện ConstraintException here

Hy vọng điều này sẽ hữu ích.

3

Khi bạn sử dụng một tập dữ liệu đánh máy mạnh mẽ và sử dụng các thiết kế trực quan (XSD): để truy cập tbl.Rows [0] .RowError thông tin, bạn cần phải tạo ra các Điền phương pháp.

Bạn không thể sử dụng phương thức Get, vì DataTable được mã hóa bên trong mã được tạo.

+0

như bạn đã nói, bạn cần điền. Rất lạ; tại sao tôi cần một tuyên bố điền khi tôi chỉ nhận được một số dữ liệu (chọn cơ bản). Một nơi nào đó bên trong nghĩ rằng phương pháp Fill này được sử dụng bởi .net có vẻ như. Sau khi tôi tạo ra một phương pháp Fill (không có thay đổi trên get) nó làm việc. – Obelix

1

Đối với nhân viên của Google, người muốn có một đoạn mã để biết thêm chi tiết về ConstraintException:

try 
{ 
    ds.EnforceConstraints = true; 
} 
catch (ConstraintException ex) 
{ 
    string details = string.Join("", 
     ds.Tables.Cast<DataTable>() 
      .Where(t => t.HasErrors) 
      .SelectMany(t => t.GetErrors()) 
      .Take(50) 
      .Select(r => "\n - " + r.Table.TableName + "[" + string.Join(", ", r.Table.PrimaryKey.Select(c => r[c])) + "]: " + r.RowError)); 
    throw new ConstraintException(ex.Message + details); 
} 
Các vấn đề liên quan