如何解决无法启用约束一行或多行包含违反非空、唯一或外键约束的值
此问题通常由以下原因之一引起
- 为未设置为 AllowDBNull 的列返回空值
- 使用相同的主键返回重复的行。
- 数据库和数据集之间的列定义(例如 char 字段的大小)不匹配
如果结果集不是太大,请尝试本地运行查询并查看结果。如果您已经消除了空值,那么我的猜测是主键列被复制了。
或者,要查看确切的错误,您可以像这样手动将 Try/Catch 块添加到生成的代码中,然后在引发异常时中断:
然后在命令窗口中,调用GetErrors
得到错误的表上的方法。
对于 C#,命令是? dataTable.GetErrors()
对于 VB,命令是? dataTable.GetErrors
这将显示所有有错误的数据行。然后,您可以查看其中RowError
的每一个,它应该会告诉您无效的列以及问题。因此,要查看错误中第一个数据行的错误,命令是:? dataTable.GetErrors(0).RowError
或者在 C# 中它将是? dataTable.GetErrors()[0].RowError
解决方法
我进行了外部联接并在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 = ....
问题发生在 table 上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
这解决了我的问题。非常感谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。