Не удалось включить ограничения. Одна или несколько строк содержат значения, нарушающие ненулевые, уникальные ограничения или ограничения внешнего ключа. ошибка в VB.Net - PullRequest
3 голосов
/ 09 декабря 2011

В StackOverFlow было три похожих вопроса, но ни один не дал ответа ..

Если вы обнаружили причину возникновения этой ошибки, но не знаете, как ее исправить.

Я использую Strongly Typed Dataset для моего проекта, который создан как dll для DAL.

Я добавил таблицу Sql Server в этот набор данных с помощью конструктора и создал DataAdapter

This is how the datatable looks

Работает нормально, когда я вставляю с использованием DataTableAdapter

daLabTest.Insert(txtLabTestId.Text, cmbLabTestType.Text, cmbTestName.Text, txtLabFees.Text, dtpLabEffDate.Value)

, но когда я хочу показать данные из таблицы в комбинированном окне или в виде таблицы, я получаю эту ошибку.

Error showned in visual Studio

я сказал, что выяснил, в чем проблема, я просто просмотрел данные с помощью конструктора DataSet и обнаружил, что функция возвращает данные вот так ...

data i got preview

Запрос, который я написал для просмотра этого в наборе данных:

Select distinct(TestType) from LabTestTypes

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

Чтобы решить эту проблему, я попытался изменить свойство NullValue & AllowDBNull на [Empty] и true соответственно, но у меня это не сработало.

Пожалуйста, помогите мне в этом ...

Ответы [ 3 ]

6 голосов
/ 18 апреля 2012

Это слишком общее исключение из ограничений является мерзким, где же InnerException после стольких жалоб?!

Этот шаблон может помочь идентифицировать проблемную строку и столбец, но требуется "заполнить" версию функции запроса. Например. GetDistinct * () -> Fill * (). Затем можно создать таблицу и запросить текст ошибки строки.

    SomeTable tTable = new SomeTable()
    try {
       // sorry, if you have a GetData, change to the fill version
         someTable.FillByActiveLogin(tTable, loginName);
    } catch (System.Data.ConstraintException constrExc) {             
            System.Data.DataRow[] rowsErr = tTable.GetErrors();
            for (int i = 0; i < rowsErr.Count(); i++)
                if (rowsErr[i].HasErrors)
                  Dbg.WriteLine(rowsErr[i].RowError);
    }

(Спасибо Michael S за эту подсказку, где бы вы ни находились!)

0 голосов
/ 25 февраля 2016

После того, как я потратил целую вечность на эту проблему, я решил ее изменить, изменив запрос в наборе данных, чтобы он возвращал фиктивное значение (которое можно игнорировать) для каждого ключевого поля, которое не требуется в выходных данных.

Итак, ваш запрос станет ...

Select distinct TestType, 1 as ID, "Dummy" as TestName, "Dummy" as TestFees, "Dummy" as TestDate  
from LabTestTypes
0 голосов
/ 13 января 2015

Я получил эту ошибку в функции из DLL, которая использует хранимую процедуру.Процедура не вернула все поля в таблице.Одно из исключенных полей было пустым.Это, очевидно, вызвало исключение ограничения.Когда я изменил процедуру и библиотеку DLL, чтобы включить это поле, исключение исчезло.

...