为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
POPMUISE 2019-07-26 15:14:39
无法启用约束。一个或多个行包含违反非空、唯一或外键约束的值。我创建了一个外部连接,并在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 = ....这个问题发生在表中。cc1assiscrseval..主键是(Batch_NO,crsnum,lect_code)。如何解决这个问题?编辑:根据@PaulStock建议:我照他说的做,我得到:?dt.GetError()[0]{System.Data.DataRow}HasError:true ItemArray:{Object[10]}RowError:“列‘val’不允许DBNull.Value”。所以我用e.eval到,NVL (e.eval,'') eval这解决了我的问题。非常感谢。
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

此问题通常是由下列因素之一引起的

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

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

或者,要查看确切的错误,您可以手动向生成的代码添加一个try/catch块,就像这样,然后在引发异常时中断:

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

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




查看完整回答
反对 回复 2019-07-27
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

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

G.

dataset.TableA.Clear();dataset.EnforceConstraints = false;dataAdapter1.daTableA.Fill(dataset, TableA");

填充方法对您来说可能略有不同。


查看完整回答
反对 回复 2019-07-27
?
慕神8447489

TA贡献1780条经验 获得超1个赞

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

这是在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);
     }
  }

对不起,PKColumns是我在扩展DataTable时添加的,它告诉我构成DataTable主键的所有列。如果您知道DataTable中的主键列,可以在这里循环它们。在我的例子中,由于我的所有数据都知道它们的PK Cols,所以我可以为所有表自动编写这些错误的调试。

输出如下:

Row FIRST_NAME: 'HOMER', LAST_NAME: 'SIMPSON', MIDDLE_NAME: 'J',  has error: Column 'HAIR_COLOR' does not allow DBNull.Value.





查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 443 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信