«Не удалось включить ограничения» Ошибка появляется (кажется, случайно) в моем проекте ASP.Net - PullRequest
1 голос
/ 10 марта 2009

У меня странная проблема, когда «Не удалось включить ограничения. Одна или несколько строк содержат значения, нарушающие ограничения ненулевого, уникального или внешнего ключа». Иногда ошибка появляется при попытке создать проект.

В строке конструктора для набора данных рассматриваемая строка, выдавшая ошибку, была автоматически сгенерированным кодом . Чтобы узнать обидную таблицу, я использовал следующий код:

      Try
            Me.Adapter.Fill(dataTable) <--Breakpoint here on the offending line

        Catch ex As Exception

            For Each TRow As DataRow In dataTable.Rows
                If TRow.HasErrors Then
                    Trace.Write(TRow.RowError)
                End If
            Next

        End Try

Как ни странно, как только я запускаю проект после ввода вышеуказанного кода и точки останова, ошибка исчезает. Я предполагаю, что это как-то связано с регенерируемым кодом. Все данные представлены успешно, и проект компилируется без ошибок.

Однако, это случалось достаточно часто, чтобы я расстраивал меня. Кто-нибудь знает, что может быть причиной ошибки и как я могу ее изолировать?

Ответы [ 4 ]

0 голосов
/ 18 февраля 2014

Вы должны использовать этот код, прежде чем заполнять DataTable:

var dt = new System.DataTable.DataTable();
dt.Clear();
dt.Rows.Clear();
dt.Columns.Clear();
0 голосов
/ 10 марта 2009

Возможно, вы работаете с типизированным набором данных или имеете некоторую конфигурацию кода. Также вы можете читать из одной таблицы, а затем добавлять данные из другой.

В любом из этих случаев вы действительно хотите изучить любые несоответствия между схемой. Если это типизированный набор данных / или сконфигурированный в коде, проверьте его определение и найдите что-нибудь отличное от таблицы sql. Если вы читаете из 2 разных таблиц, проверьте определение обеих таблиц.

0 голосов
/ 14 марта 2009

Наконец-то понял!

Причина, по которой точка останова не была достигнута, заключалась в том, что рассматриваемый код был сгенерирован автоматически и имел атрибут "DebuggerNonUserCodeAttribute". Кроме того, в настройках VS я установил отладчик «Просто мой код».

Когда я снова запустил код и точка останова не была достигнута, я заметил, что значок точки останова изменился на предупреждение. Зависание показало это:

"The breakpoint will currently not be hit. Breakpoints cannot be set in a method or class with the 'DebuggerNonUserCode' attribute when the debugger option 'Just My Code' is enabled."

Ой!

Как только я удалил опцию отладки «Просто мой код», была достигнута точка останова, и я обнаружил, что одна из строк имеет значение NULL в одном из столбцов с ненулевым ограничением. Глупый оле меня!

0 голосов
/ 10 марта 2009

Какое уникальное ограничение вы накладываете на таблицу данных и проверили ли вы, что передаваемые вами данные не имеют дубликатов? Если это происходит из общей базы данных, возможно, кто-то другой изменяет данные, что может быть причиной случайности.

Редактировать

Если этот код точно такой же, как у вас (и простите меня, мой vb.net не так силен, как мой C #). Не поглотит ли это исключение? В C # нам нужно сбросить ошибку.

Добавьте Trace.Write () прямо перед тем, как перейти в цикл for.

...