无法启用约束。一行或多行包含违反非空、唯一或外键约束的值

新手上路,请多包涵

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

 DataTable dt = TeachingLoadDAL.GetCoursesWithEvalState(i, bat);

无法启用约束。一行或多行包含违反非空、唯一或外键约束的值。

我知道问题所在,但我不知道如何解决。

我进行外连接的第二个表包含一个复合主键,在前一个外连接查询中为空。

编辑:

     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 = ....

问题发生在表 cc1assiscrseval 上。主键是 (batch_no, crsnum, lect_code)。

如何解决这个问题?


编辑:

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

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

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

原文由 Anyname Donotcare 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 884
2 个回答

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

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

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

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

在此处输入图像描述

然后在命令窗口中,调用 GetErrors 表上的方法得到错误。

对于 C#,命令将是 ? dataTable.GetErrors()

对于VB,命令是 ? dataTable.GetErrors

在此处输入图像描述

这将显示所有有错误的数据行。然后,您可以查看每一个的 RowError ,它应该会告诉您无效的列以及问题。因此,要查看错误的第一个数据行的错误,命令是:

? dataTable.GetErrors(0).RowError

或者在 C# 中是 ? dataTable.GetErrors()[0].RowError

在此处输入图像描述

原文由 PaulStock 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您有失败的数据集(不是数据表):

 if (dataSet.HasErrors)
    foreach (DataTable table in dataSet.Tables)
        if (table.HasErrors)
            foreach (var row in table.GetErrors())
                Debug.Write($"Error in DataTable {table.TableName}: {row.RowError}")

原文由 avj 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Stack Overflow 翻译
子站问答
访问
宣传栏