C# 未能启用约束。一个或多个行包含违反非空、唯一或外键约束的值
我创建了一个外部联接,并在C# 未能启用约束。一个或多个行包含违反非空、唯一或外键约束的值,c#,asp.net,sql,database,informix,C#,Asp.net,Sql,Database,Informix,我创建了一个外部联接,并在informix数据库中成功执行,但我的代码中出现以下异常: DataTable dt = TeachingLoadDAL.GetCoursesWithEvalState(i, bat); 未能启用约束。一行或多行包含值 违反非空、唯一或外键约束 我知道这个问题,但我不知道如何解决它 我创建外部联接的第二个表包含一个复合主键,该主键在前面的外部联接查询中为null 编辑: SELECT UNIQUE a.crs_e, a.crs_e || '/ ' ||
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 = ....
该问题发生在表CC1Assicseval
中。主键是(批次号、crsnum、选择代码)
如何解决这个问题
编辑:
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 = ....
根据@PaulStock
建议:
我照他说的做,我得到:
??dt.GetErrors()[0]{System.Data.DataRow}HasErrors:true ItemArray:
{object[10]}RowError:“列'eval'不允许DBNull.Value。”
因此,我通过将e.eval
替换为,NVL(e.eval),)eval
解决了我的问题。
非常感谢。听起来可能有一个或多个列被选中:
e.eval, e.batch_no, e.crsnum, e.lect_code, e.prof_course
在数据集定义中将AllowDBNull设置为False。此问题通常由以下原因之一引起
- 为未设置为AllowDBNull的列返回空值
- 使用相同的主键返回重复的行
- 数据库和数据集之间的列定义不匹配(例如,字符字段的大小)
GetErrors
方法。对于C#,命令应该是
?dataTable.GetErrors()
对于VB,命令是
?dataTable.GetErrors
这将显示有错误的所有数据行。然后,您可以查看每一项的行错误
,这将告诉您无效的列以及问题所在。因此,要查看错误中第一个数据行的错误,命令是:?dataTable.GetErrors(0).RowError
或者在C语言中是
?dataTable.GetErrors()[0]。行错误
不清楚为什么运行SELECT语句需要启用约束。我不知道C#或相关技术,但我知道Informix数据库。如果您的查询代码正在启用(可能也在禁用)约束,那么系统会出现一些奇怪的情况 您还应该避免使用老式的、非标准的Informix外部连接表示法。除非您使用的是非常旧的Informix版本,否则您应该使用SQL-92风格的连接 您的问题似乎提到了两个外部联接,但在示例查询中只显示了一个。这也有点令人费解 “
e
”与其他表格之间的连接条件为:
AND c.crsnum = e.crsnum
AND c.batch_no = e.batch_no
AND d.lect_code= e.lect_code
这是一个不寻常的组合。由于我们没有具有相关引用完整性约束的模式的相关子集,因此很难知道这是否正确,但在3个表之间这样连接有点不寻常
这些都不是你问题的最终答案;但是,它可以提供一些指导。- 确保表适配器查询中命名的字段与您定义的查询中的字段匹配。DAL似乎不喜欢不匹配。在向表中添加新字段后,存储过程和查询通常会发生这种情况
- 如果您已经更改了数据库中varchar字段的长度,而XSS文件中包含的XML尚未拾取该字段,请在XML中找到字段名和属性定义,然后手动更改它
- 如果主键与返回的数据无关,请从表适配器中的选择列表中删除主键
- 在SQL Management Studio中运行查询,并确保没有返回重复的记录。重复记录会生成重复的主键,这将导致此错误
- SQL联合可能会带来麻烦。我修改了一个表适配器,在其他记录之前添加了一条“请选择一名员工”记录。对于其他字段,我提供了虚拟数据,例如,长度为1的字符串。DAL从该初始记录推断出模式。以下字符串长度为12的记录失败
这直接给出了错误这个错误也出现在我的项目中。我尝试了这里发布的所有建议解决方案,但一点运气都没有,因为问题与字段大小、表键字段定义、约束或EnforceConstraints数据集变量无关 在我的例子中,我还有一个.xsd对象,我在项目设计阶段(数据访问层)将它放在那里。当您将数据库表对象拖动到Dataset可视项中时,它会从基础数据库读取每个表定义,并将约束复制到Dataset对象中,就像您在数据库中创建表时定义的那样(在我的示例中是SQL Server 2008 R2)。这意味着,使用“NOTNULL”或“外键”约束创建的每个表列也必须出现在SQL语句或存储过程的结果中 在我包含了所有关键列和t之后
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);
}
}
Row FIRST_NAME: 'HOMER', LAST_NAME: 'SIMPSON', MIDDLE_NAME: 'J', has error: Column 'HAIR_COLOR' does not allow DBNull.Value.
this.columnAttachPDFToEmailFlag.AllowDBNull = true;
string newQuery = "select * from (" + query + ") as temp";
using (var tbl = new DataTable())
using (var rdr = cmd.ExecuteReader())
{
tbl.BeginLoadData();
try
{
tbl.Load(rdr);
}
catch (ConstraintException ex)
{
rdr.Close();
tbl.Clear();
// clear constraints, source of exceptions
// note: column schema already loaded!
tbl.Constraints.Clear();
tbl.Load(cmd.ExecuteReader());
}
finally
{
tbl.EndLoadData();
}
}
this.exchangeCheckoutReportTableAdapter.Fill(this.sbmsDataSet.ExchangeCheckouReportTable);