我执行了一个外部连接,并在informix
数据库中成功执行,但我的代码中出现了以下异常:
DataTable dt = TeachingLoadDAL.GetCoursesWithEvalState(i, bat);
无法启用约束。一个或多个行包含违反非null、unique或外键约束的值。
我知道问题所在,但我不知道如何解决它。
我进行外部连接的第二个表包含一个复合主键,它们在前面的外部连接查询中为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.GetErrors() {System.Data.DataRow} HasErrors: true ItemArray:{object10} RowError:“列'eval‘不允许DBNull.Value。”
所以我把e.eval
替换成,NVL (e.eval,'') eval
,.and,这解决了我的问题。非常感谢。
发布于 2011-08-12 00:43:21
此问题通常是由以下原因之一引起的
为未设置为AllowDBNull
之间的列定义(例如,字符字段的大小)不匹配。
如果结果集不是太大,请尝试本机运行查询并查看结果。如果您已经消除了空值,那么我的猜测是主键列正在被复制。
或者,要查看确切的错误,您可以手动将Try/Catch块添加到生成的代码中,然后在引发异常时中断:
然后在命令窗口中,对获取错误的表调用GetErrors
方法。
对于C#,命令为? dataTable.GetErrors()
对于VB,该命令为? dataTable.GetErrors
这将向您显示有错误的所有数据行。您可以获取并查看其中每一个的RowError
,它应该会告诉您无效的列以及问题。因此,要查看出错的第一个数据行的错误,命令是:
? dataTable.GetErrors(0).RowError
或者在C#中应该是? dataTable.GetErrors()[0].RowError
发布于 2012-08-08 18:33:41
您可以禁用数据集上的约束。它将允许您识别坏数据并帮助解决问题。
例如:
dataset.TableA.Clear();
dataset.EnforceConstraints = false;
dataAdapter1.daTableA.Fill(dataset, TableA");
对于您来说,fill方法可能略有不同。
发布于 2013-06-03 22:32:02
这将查找表中有错误的所有行,打印出该行的主键和该行上发生的错误……
这是在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列,所以我可以为所有的表自动编写这些错误的debug。
输出如下所示:
Row FIRST_NAME: 'HOMER', LAST_NAME: 'SIMPSON', MIDDLE_NAME: 'J', has error: Column 'HAIR_COLOR' does not allow DBNull.Value.
如果您对上面的PKColumns部分感到困惑-这会打印出列名和值,这并不是必需的,但会添加有用的故障排除信息,以确定哪些列值可能会导致问题。删除此部分并保留其余部分仍将打印生成的SQLite错误,它将指出有问题的列。
https://stackoverflow.com/questions/7026566
复制相似问题