C# 未能启用约束。一个或多个行包含违反非空、唯一或外键约束的值

C# 未能启用约束。一个或多个行包含违反非空、唯一或外键约束的值,c#,asp.net,sql,database,informix,C#,Asp.net,Sql,Database,Informix,我创建了一个外部联接,并在informix数据库中成功执行,但我的代码中出现以下异常: DataTable dt = TeachingLoadDAL.GetCoursesWithEvalState(i, bat); 未能启用约束。一行或多行包含值 违反非空、唯一或外键约束 我知道这个问题,但我不知道如何解决它 我创建外部联接的第二个表包含一个复合主键,该主键在前面的外部联接查询中为null 编辑: SELECT UNIQUE a.crs_e, a.crs_e || '/ ' ||

我创建了一个外部联接,并在
informix
数据库中成功执行,但我的代码中出现以下异常:

DataTable dt = TeachingLoadDAL.GetCoursesWithEvalState(i, bat);
未能启用约束。一行或多行包含值 违反非空、唯一或外键约束

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

我创建外部联接的第二个表包含一个复合主键,该主键在前面的外部联接查询中为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 = ....
该问题发生在表
CC1Assicseval
中。主键是(批次号、crsnum、选择代码)

如何解决这个问题


编辑:

    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 = ....
根据
@PaulStock
建议: 我照他说的做,我得到:

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

因此,我通过将
e.eval
替换为,
NVL(e.eval),)eval
解决了我的问题。
非常感谢。

听起来可能有一个或多个列被选中:

   e.eval, e.batch_no, e.crsnum, e.lect_code, e.prof_course

在数据集定义中将AllowDBNull设置为False。

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

  • 为未设置为AllowDBNull的列返回空值
  • 使用相同的主键返回重复的行
  • 数据库和数据集之间的列定义不匹配(例如,字符字段的大小)
如果结果集不太大,请尝试以本机方式运行查询并查看结果。如果您已经消除了空值,那么我的猜测是主键列正在被复制

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

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

对于VB,命令是
?dataTable.GetErrors

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

或者在C语言中是
?dataTable.GetErrors()[0]。行错误


不清楚为什么运行SELECT语句需要启用约束。我不知道C#或相关技术,但我知道Informix数据库。如果您的查询代码正在启用(可能也在禁用)约束,那么系统会出现一些奇怪的情况

您还应该避免使用老式的、非标准的Informix外部连接表示法。除非您使用的是非常旧的Informix版本,否则您应该使用SQL-92风格的连接

您的问题似乎提到了两个外部联接,但在示例查询中只显示了一个。这也有点令人费解

e
”与其他表格之间的连接条件为:

AND c.crsnum = e.crsnum  
AND c.batch_no = e.batch_no  
AND d.lect_code= e.lect_code 
这是一个不寻常的组合。由于我们没有具有相关引用完整性约束的模式的相关子集,因此很难知道这是否正确,但在3个表之间这样连接有点不寻常

这些都不是你问题的最终答案;但是,它可以提供一些指导。

  • 确保表适配器查询中命名的字段与您定义的查询中的字段匹配。DAL似乎不喜欢不匹配。在向表中添加新字段后,存储过程和查询通常会发生这种情况

  • 如果您已经更改了数据库中varchar字段的长度,而XSS文件中包含的XML尚未拾取该字段,请在XML中找到字段名和属性定义,然后手动更改它

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

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

  • SQL联合可能会带来麻烦。我修改了一个表适配器,在其他记录之前添加了一条“请选择一名员工”记录。对于其他字段,我提供了虚拟数据,例如,长度为1的字符串。DAL从该初始记录推断出模式。以下字符串长度为12的记录失败


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

e、 g

填充方法可能与您略有不同。

DirectCast(dt.Rows(0),DataRow)。RowError


这直接给出了错误

这个错误也出现在我的项目中。我尝试了这里发布的所有建议解决方案,但一点运气都没有,因为问题与字段大小、表键字段定义、约束或EnforceConstraints数据集变量无关

在我的例子中,我还有一个.xsd对象,我在项目设计阶段(数据访问层)将它放在那里。当您将数据库表对象拖动到Dataset可视项中时,它会从基础数据库读取每个表定义,并将约束复制到Dataset对象中,就像您在数据库中创建表时定义的那样(在我的示例中是SQL Server 2008 R2)。这意味着,使用“NOTNULL”或“外键”约束创建的每个表列也必须出现在SQL语句或存储过程的结果中

在我包含了所有关键列和t之后
 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);
     }
  }
Row FIRST_NAME: 'HOMER', LAST_NAME: 'SIMPSON', MIDDLE_NAME: 'J',  has error: Column 'HAIR_COLOR' does not allow DBNull.Value.
this.columnAttachPDFToEmailFlag.AllowDBNull = true;
string newQuery = "select * from (" + query + ") as temp";
            using (var tbl = new DataTable())
            using (var rdr = cmd.ExecuteReader())
            {
                tbl.BeginLoadData();

                try
                {
                    tbl.Load(rdr);
                }
                catch (ConstraintException ex)
                {
                    rdr.Close();
                    tbl.Clear();

                    // clear constraints, source of exceptions
                    // note: column schema already loaded!
                    tbl.Constraints.Clear();
                    tbl.Load(cmd.ExecuteReader());
                }
                finally
                {
                    tbl.EndLoadData();
                }
            }
   this.exchangeCheckoutReportTableAdapter.Fill(this.sbmsDataSet.ExchangeCheckouReportTable);