无法启用约束.一行或多行包含违反非null,唯一或外键约束的值

Any*_*are 161 c# sql database asp.net informix

我做了一个外连接并在informix数据库中成功执行但我在我的代码中得到以下异常:

DataTable dt = TeachingLoadDAL.GetCoursesWithEvalState(i, bat);
Run Code Online (Sandbox Code Playgroud)

无法启用约束.一行或多行包含违反非null,唯一或外键约束的值.

我知道这个问题,但我不知道如何解决它.

我在外连接上创建的第二个表包含一个复合主键,它在前一个外连接查询中为空.

编辑:

    SELECT UNIQUE a.crs_e,  a.crs_e  || '/ ' || a.crst crs_name, b.period,
           b.crscls, c.crsday, c.from_lect, c.to_lect,
           c.to_lect - c.from_lect + 1 Subtraction, c.lect_kind, e.eval, e.batch_no,
           e.crsnum, e.lect_code, e.prof_course
    FROM rlm1course a, rfc14crsgrp b, ckj1table c, mnltablelectev d,
         OUTER(cc1assiscrseval e)  
    WHERE a.crsnum = b.crsnum 
    AND b.crsnum = c.crsnum 
    AND b.crscls = c.crscls 
    AND b.batch_no = c.batch_no 
    AND c.serial_key = d.serial_key  
    AND c.crsnum = e.crsnum  
    AND c.batch_no = e.batch_no  
    AND d.lect_code= e.lect_code 
    AND d.lect_code = .... 
    AND b.batch_no = ....
Run Code Online (Sandbox Code Playgroud)

问题发生在表格中cc1assiscrseval.主键是(batch_no,crsnum,lect_code).

如何解决这个问题?


编辑:

根据@PaulStock建议:我做他说的话,我得到:

?dt.GetErrors()[0] {System.Data.DataRow} HasErrors:true ItemArray:{object [10]} RowError:"Column'eval'不允许DBNull.Value."

所以我通过替换 e.evalNVL (e.eval,'') eval解决我的问题,这解决了我的问题.非常感谢.

Pau*_*ock 332

此问题通常由以下之一引起

  • 对于未设置为AllowDBNull的列,将返回null值
  • 使用相同的主键返回重复的行.
  • 数据库和数据集之间的列定义(例如,字段的大小)不匹配

如果结果集不是太大,请尝试本机运行查询并查看结果.如果你已经消除了空值,那么我的猜测是主键列是重复的.

或者,要查看确切的错误,您可以手动将Try/Catch块添加到生成的代码中,然后在引发异常时中断:

在此输入图像描述

然后在命令窗口中,调用GetErrors表上的方法获取错误.
对于C#,命令是? dataTable.GetErrors()
For VB,命令是? dataTable.GetErrors

在此输入图像描述

这将显示所有有错误的数据行.然后,您可以查看其中RowError的每一个,这应该告诉您该列无效以及该问题.因此,要查看错误的第一个数据行的错误,命令是:
? dataTable.GetErrors(0).RowError
或者在C#中它将是? dataTable.GetErrors()[0].RowError

在此输入图像描述

  • 对于C#命令如下:`>?dataTable.GetErrors()[0]` (7认同)
  • 是的,这真的很有用 - 我的错误的原因是字段的长度比表适配器中的列的maxLength长.我注意到的一件事是,为了触及设计器文件中的断点,您需要转到工具>选项>调试,并确保未选中"启用我的代码".然后它将允许您逐步执行设计器文件代码. (6认同)
  • 非常感谢 .'>?dt.GetErrors()[0] {System.Data.DataRow} HasErrors:true ItemArray:{object [10]} RowError:"Column'eval'不允许DBNull.Value." (4认同)
  • 真棒.这不起作用,但我可以为数据集添加监视并在其后键入.GetErrors并展开值.这非常有用.希望在下次需要它之前我不会忘记它:) (4认同)
  • 这非常有用,我发现数据列长度不匹配 - 它在数据库中而不是在数据集中增加。 (2认同)

Hoc*_*eyJ 35

您可以禁用数据集上的约束.它将允许您识别错误数据并帮助解决问题.

例如

dataset.TableA.Clear();
dataset.EnforceConstraints = false;
dataAdapter1.daTableA.Fill(dataset, TableA");
Run Code Online (Sandbox Code Playgroud)

填充方法可能会略有不同.


shi*_*igo 10

这将找到表中有错误的所有行,打印出行的主键以及该行上发生的错误...

这是在C#中,但将其转换为VB应该不难.

 foreach (DataRow dr in dataTable)
 {
   if (dr.HasErrors)
     {
        Debug.Write("Row ");
        foreach (DataColumn dc in dataTable.PKColumns)
          Debug.Write(dc.ColumnName + ": '" + dr.ItemArray[dc.Ordinal] + "', ");
        Debug.WriteLine(" has error: " + dr.RowError);
     }
  }
Run Code Online (Sandbox Code Playgroud)

糟糕 - 抱歉PKColumns是我在扩展DataTable时添加的,它告诉我构成DataTable主键的所有列.如果您知道数据表中的主键列,则可以在此处循环访问它们.在我的情况下,由于我的所有数据表都知道他们的PK列,我可以自动为所有表编写这些错误的调试.

输出如下所示:

Row FIRST_NAME: 'HOMER', LAST_NAME: 'SIMPSON', MIDDLE_NAME: 'J',  has error: Column 'HAIR_COLOR' does not allow DBNull.Value.
Run Code Online (Sandbox Code Playgroud)


小智 7

  • 确保表适配器查询中指定的字段与您定义的查询中的字段匹配.DAL似乎不喜欢不匹配.在向表中添加新字段后,通常会对您的sprocs和查询进行此操作.

  • 如果更改了数据库中varchar字段的长度,并且XSS文件中包含的XML尚未提取,请在XML中查找字段名称和属性定义并手动更改.

  • 如果表适配器中的主键与返回的数据无关,则从表适配器中的选择列表中删除主键.

  • 在SQL Management Studio中运行查询,并确保没有返回重复的记录.重复记录可能会生成重复的主键,从而导致此错误.

  • SQL联盟可以拼出麻烦.我通过在其他人之前添加"请选择员工"记录来修改一个表适配器.对于其他字段,我提供了虚拟数据,包括例如长度为1的字符串.DAL从该初始记录推断出模式.记录以下长度为12的字符串失败.


Som*_*ody 5

这对我有用,来源:这里

我有这个错误,它与数据库约束无关(至少在我的情况下).我有一个带有GetRecord查询的.xsd文件,该查询返回一组记录.该表的一列是"nvarchar(512)",在项目中间我需要将其更改为"nvarchar(MAX)".

一切正常,直到用户在该字段上输入超过512,我们开始得到着名的错误消息"无法启用约束.一行或多行包含违反非空,唯一或外键约束的值."

解决方案:检查DataTable中列的所有MaxLength属性.

我是从"为nvarchar(512)"改列"为nvarchar(MAX)"还对MaxLength属性的值512,所以我改成了"-1"和它的作品!.


小智 5

问题出在数据访问设计器上。在 Visual Studio 中,当我们将视图从“服务器资源管理器”拉到设计器窗口时,它会在列上随机添加主键或将某些内容标记为 NOT NULL,尽管它实际上已设置为 null。尽管 SQL db 服务器中的实际视图创建没有定义任何主键或定义 NOT NULL,但 VS 设计器正在添加此键/约束。

您可以在设计器中看到这一点 - 它在列名称左侧显示有一个钥匙图标。

解决方案:右键单击钥匙图标并选择“删除钥匙”。这应该可以解决问题。您还可以右键单击列并选择“属性”以查看 VS 数据访问设计器中列的属性列表并适当更改值。