猿问

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

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

我创建了一个外部连接,并在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这解决了我的问题。非常感谢。


POPMUISE
浏览 444回答 3
3回答

catspeake

此问题通常是由下列因素之一引起的未设置为AllowDBNull的列返回空值使用相同的主键返回重复行。数据库和数据集之间列定义(例如char字段的大小)之间的不匹配尝试本机运行查询,如果结果集不太大,请查看结果。如果您已经消除了空值,那么我的猜测是主键列正在被复制。或者,要查看确切的错误,您可以手动向生成的代码添加一个try/catch块,就像这样,然后在引发异常时中断:然后在命令窗口内调用GetErrors方法在表上获取错误。对于C#,命令如下? dataTable.GetErrors()对于VB,命令是? dataTable.GetErrors这将显示所有错误的数据行。你可以看看RowError对于其中的每一个,都应该告诉您无效的列以及问题。因此,要查看错误中的第一个datarow的错误,命令如下:? dataTable.GetErrors(0).RowError或者在C#中? dataTable.GetErrors()[0].RowError

红颜莎娜

可以禁用数据集上的约束。它将允许您识别不良数据并帮助解决问题。G.dataset.TableA.Clear();dataset.EnforceConstraints = false;dataAdapter1.daTableA.Fill(dataset, TableA");填充方法对您来说可能略有不同。

慕神8447489

这将在表中找到有错误的所有行,打印该行的主键和该行上发生的错误.这是在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.
随时随地看视频慕课网APP
我要回答