Any*_*are 161 c# sql database asp.net informix
我做了一个外连接并在informix
数据库中成功执行但我在我的代码中得到以下异常:
DataTable dt = TeachingLoadDAL.GetCoursesWithEvalState(i, bat);
Run Code Online (Sandbox Code Playgroud)
无法启用约束.一行或多行包含违反非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 = ....
Run Code Online (Sandbox Code Playgroud)
问题发生在表格中cc1assiscrseval
.主键是(batch_no,crsnum,lect_code).
如何解决这个问题?
编辑:
根据@PaulStock
建议:我做他说的话,我得到:
?dt.GetErrors()[0] {System.Data.DataRow} HasErrors:true ItemArray:{object [10]} RowError:"Column'eval'不允许DBNull.Value."
所以我通过替换 e.eval
来NVL (e.eval,'') eval
解决我的问题,这解决了我的问题.非常感谢.
Pau*_*ock 332
此问题通常由以下之一引起
如果结果集不是太大,请尝试本机运行查询并查看结果.如果你已经消除了空值,那么我的猜测是主键列是重复的.
或者,要查看确切的错误,您可以手动将Try/Catch块添加到生成的代码中,然后在引发异常时中断:
然后在命令窗口中,调用GetErrors
表上的方法获取错误.
对于C#,命令是? dataTable.GetErrors()
For VB,命令是? dataTable.GetErrors
这将显示所有有错误的数据行.然后,您可以查看其中RowError
的每一个,这应该告诉您该列无效以及该问题.因此,要查看错误的第一个数据行的错误,命令是:
? dataTable.GetErrors(0).RowError
或者在C#中它将是? dataTable.GetErrors()[0].RowError
Hoc*_*eyJ 35
您可以禁用数据集上的约束.它将允许您识别错误数据并帮助解决问题.
例如
dataset.TableA.Clear();
dataset.EnforceConstraints = false;
dataAdapter1.daTableA.Fill(dataset, TableA");
Run Code Online (Sandbox Code Playgroud)
填充方法可能会略有不同.
shi*_*igo 10
这将找到表中有错误的所有行,打印出行的主键以及该行上发生的错误...
这是在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);
}
}
Run Code Online (Sandbox Code Playgroud)
糟糕 - 抱歉PKColumns是我在扩展DataTable时添加的,它告诉我构成DataTable主键的所有列.如果您知道数据表中的主键列,则可以在此处循环访问它们.在我的情况下,由于我的所有数据表都知道他们的PK列,我可以自动为所有表编写这些错误的调试.
输出如下所示:
Row FIRST_NAME: 'HOMER', LAST_NAME: 'SIMPSON', MIDDLE_NAME: 'J', has error: Column 'HAIR_COLOR' does not allow DBNull.Value.
Run Code Online (Sandbox Code Playgroud)
小智 7
确保表适配器查询中指定的字段与您定义的查询中的字段匹配.DAL似乎不喜欢不匹配.在向表中添加新字段后,通常会对您的sprocs和查询进行此操作.
如果更改了数据库中varchar字段的长度,并且XSS文件中包含的XML尚未提取,请在XML中查找字段名称和属性定义并手动更改.
如果表适配器中的主键与返回的数据无关,则从表适配器中的选择列表中删除主键.
在SQL Management Studio中运行查询,并确保没有返回重复的记录.重复记录可能会生成重复的主键,从而导致此错误.
SQL联盟可以拼出麻烦.我通过在其他人之前添加"请选择员工"记录来修改一个表适配器.对于其他字段,我提供了虚拟数据,包括例如长度为1的字符串.DAL从该初始记录推断出模式.记录以下长度为12的字符串失败.
这对我有用,来源:这里
我有这个错误,它与数据库约束无关(至少在我的情况下).我有一个带有GetRecord查询的.xsd文件,该查询返回一组记录.该表的一列是"nvarchar(512)",在项目中间我需要将其更改为"nvarchar(MAX)".
一切正常,直到用户在该字段上输入超过512,我们开始得到着名的错误消息"无法启用约束.一行或多行包含违反非空,唯一或外键约束的值."
解决方案:检查DataTable中列的所有MaxLength属性.
我是从"为nvarchar(512)"改列"为nvarchar(MAX)"还对MaxLength属性的值512,所以我改成了"-1"和它的作品!.
小智 5
问题出在数据访问设计器上。在 Visual Studio 中,当我们将视图从“服务器资源管理器”拉到设计器窗口时,它会在列上随机添加主键或将某些内容标记为 NOT NULL,尽管它实际上已设置为 null。尽管 SQL db 服务器中的实际视图创建没有定义任何主键或定义 NOT NULL,但 VS 设计器正在添加此键/约束。
您可以在设计器中看到这一点 - 它在列名称左侧显示有一个钥匙图标。
解决方案:右键单击钥匙图标并选择“删除钥匙”。这应该可以解决问题。您还可以右键单击列并选择“属性”以查看 VS 数据访问设计器中列的属性列表并适当更改值。
归档时间: |
|
查看次数: |
195954 次 |
最近记录: |