无法启用约束。一行或多行包含违反非null,唯一或外键约束的值。 VB.Net中的错误

时间:2011-12-09 16:06:28

标签: vb.net visual-studio-2010 dataset sql-server-2008-r2 strongly-typed-dataset

StackOverFlow中有三个类似的问题,但没有一个给出答案..

如果找到了为什么会出现此错误但却不知道修复。

我正在为我的项目使用Strongly Typed Dataset,该项目是作为DAL的dll创建的。

我已使用设计器将Sql Server Table添加到此数据集中并创建了一个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列但其他列为null,TestName列是主列,返回时不应为null,因此存在问题..

要解决此问题,我尝试更改NullValue& AllowDBNull属性分别为[Empty]true,但这对我没用。

请帮助我...

3 个答案:

答案 0 :(得分:6)

那种过于笼统的约束异常是令人讨厌的,在这么多投诉之后是InnerException?!

此模板可能有助于识别问题行和列,但需要“填充”版本的查询功能。例如。 GetDistinct *() - >填*()。然后可以创建一个表并查询该行的错误文本。

    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提供的任何人/无论你在哪里!)

答案 1 :(得分:0)

我在使用存储过程的DLL中的函数中出现此错误。该过程未返回表中的所有字段。排除的一个字段是不能为空的字段。这显然导致约束异常。当我更改过程和DLL以包含该字段时,异常消失了。

答案 2 :(得分:0)

在我自己花了多年时间解决这个问题后,我已经解决了修改数据集中的查询以返回输出中不需要的每个关键字段的虚拟值(可以忽略)。

所以你的查询会变成......

Select distinct TestType, 1 as ID, "Dummy" as TestName, "Dummy" as TestFees, "Dummy" as TestDate  
from LabTestTypes