首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法启用约束。一个或多个行包含违反非null、unique或外键约束的值

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

Stack Overflow用户
提问于 2011-08-11 21:18:32
回答 24查看 240.8K关注 0票数 178

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

代码语言:javascript
复制
DataTable dt = TeachingLoadDAL.GetCoursesWithEvalState(i, bat);

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

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

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

编辑:

代码语言:javascript
复制
    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() {System.Data.DataRow} HasErrors: true ItemArray:{object10} RowError:“列'eval‘不允许DBNull.Value。”

所以我把e.eval替换成,NVL (e.eval,'') eval,.and,这解决了我的问题。非常感谢。

EN

回答 24

Stack Overflow用户

回答已采纳

发布于 2011-08-12 00:43:21

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

为未设置为AllowDBNull

  • duplicate的列返回不匹配的空值。

  • 数据库和dataset

之间的列定义(例如,字符字段的大小)不匹配。

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

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

然后在命令窗口中,对获取错误的表调用GetErrors方法。

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

对于VB,该命令为? dataTable.GetErrors

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

? dataTable.GetErrors(0).RowError

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

票数 381
EN

Stack Overflow用户

发布于 2012-08-08 18:33:41

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

例如:

代码语言:javascript
复制
dataset.TableA.Clear();
dataset.EnforceConstraints = false;
dataAdapter1.daTableA.Fill(dataset, TableA");

对于您来说,fill方法可能略有不同。

票数 41
EN

Stack Overflow用户

发布于 2013-06-03 22:32:02

这将查找表中有错误的所有行,打印出该行的主键和该行上发生的错误……

这是在C#中实现的,但将其转换为VB应该不难。

代码语言:javascript
复制
 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列,所以我可以为所有的表自动编写这些错误的debug。

输出如下所示:

代码语言:javascript
复制
Row FIRST_NAME: 'HOMER', LAST_NAME: 'SIMPSON', MIDDLE_NAME: 'J',  has error: Column 'HAIR_COLOR' does not allow DBNull.Value.

如果您对上面的PKColumns部分感到困惑-这会打印出列名和值,这并不是必需的,但会添加有用的故障排除信息,以确定哪些列值可能会导致问题。删除此部分并保留其余部分仍将打印生成的SQLite错误,它将指出有问题的列。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7026566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档