"无法启用此约束,因为并非所有值都有相应的父值。"



我想创建一个嵌套的XML数据表,但由于某种原因,它不断给我抛出错误:This constraint cannot be enabled as not all values have corresponding parent values.
这是我所希望的XML结果:

<Annotation>
<Information>
<folder>Kangaroo</folder>
<filename>00001.JPG</filename>
</Information>
<size>
<width>1024</width>
<height>1024</height>
<depth>3</depth>
</size>
<object>
<bndbox>
<ID>1</ID>
<xmin>143</xmin>
<ymin>163</ymin>
<xmax>332</xmax>
<ymax>335</ymax>
</bndbox>
</object>
</Annotation>

我尝试将bndbox中的 id 设置为主键,创建外键约束,并将Relations.Add方法中的createConstraints参数设置为 false。三者中的后者创建了一个XML文件,但它根本没有创建object容器,如下所示:

<Annotation>
<Information>
<folder>Kangaroo</folder>
<filename>00001.JPG</filename>
</Information>
<size>
<width>1024</width>
<height>1024</height>
<depth>3</depth>
</size>
<bndbox>
<ID>1</ID>
<xmin>143</xmin>
<ymin>163</ymin>
<xmax>332</xmax>
<ymax>335</ymax>
</bndbox>
</Annotation>


我当前的代码:

//create object table
DataTable tableObj2 = new DataTable();
tableObj2.TableName = "object";
//add column id
DataColumn objIdColumn = new DataColumn();
objIdColumn.DataType = System.Type.GetType("System.Int32");
objIdColumn.ColumnName = "ID";
tableObj2.Columns.Add(objIdColumn);
tableObj2.PrimaryKey = new DataColumn[1] { objIdColumn };
DataRow row = tableObj2.NewRow();
row["ID"] = 1;
//create binding box table
DataTable tableBb2 = new DataTable();
tableBb2.TableName = "bndbox";
DataRow dataRow4 = tableBb2.NewRow();
//add column id and coordinates
tableBb2.Columns.Add("ID", typeof(int));
tableBb2.Columns.Add("xmin", typeof(int));
tableBb2.Columns.Add("ymin", typeof(int));
tableBb2.Columns.Add("xmax", typeof(int));
tableBb2.Columns.Add("ymax", typeof(int));
//insert values
dataRow4["ID"] = 1;
dataRow4["xmin"] = dataGridView1.Rows[0].Cells[1].Value;
dataRow4["ymin"] = dataGridView1.Rows[0].Cells[2].Value;
dataRow4["xmax"] = dataGridView1.Rows[1].Cells[1].Value;
dataRow4["ymax"] = dataGridView1.Rows[1].Cells[2].Value;
tableBb2.Rows.Add(dataRow4);
//add tables to Annotation dataset
ds.Tables.Add(tableBb2);
ds.Tables.Add(tableObj2);
//create data relation
DataRelation relation = ds.Relations.Add("relation", ds.Tables["object"].Columns["ID"], ds.Tables["bndbox"].Columns["ID"]);
relation.Nested = true;

任何方向或帮助将不胜感激!

无法启用此约束,因为并非所有值都具有相应的父值。

您在此处为父表创建了一个新行:

DataRow row = tableObj2.NewRow();

但是您似乎没有将其添加到父表中。我希望在您尝试将行添加到引用此新行的子表之前在某处看到这样的代码:

tableObj2.Rows.Add(row);

因为您从未添加过此行,所以您的代码一直成功,直到您告诉 DataSet 这些表是相关的,此时它说"子表中的一行或多行在父表中没有相应的父行">

请记住;调用 NewRow 会给你一个新的分离行。必须将其添加到表中才能作为关系的一部分发挥作用


在其他新闻中,如果您右键单击您的项目,添加新项,类别Data,键入DataSet..打开DataSet,右键单击设计图面,选择"添加",您的生活会变得更好。数据表。通过右键单击列并选择"添加"来指定列。列。通过单击父 ID 中列名称旁边的行的灰色部分来指定关系,使整行变为蓝色,然后将蓝色行拖动到另一个数据表中的子 ID 上并将其删除。这将创建一个类型化的数据集。它们在智能感知中使用起来要好得多,因为它们具有列等的类型化属性,因此这些row["ID"] = 1var x = (int)row["ID"]- 行将具有整数的 ID 属性,因此它是row.ID = 1var x = row.ID- 强类型,而不是字符串类型:)

如果您确实创建了强类型数据集,请记住以下简单规则:如果您正在访问 .行或 .列集合(或将列名放在字符串中(您可能做错了。这些集合返回基本 DataRow/DataColumn 对象,这会将您放回字符串类型化的世界

//no
dt.Rows[0]
//yes
dt[0]
//no
dt.Columns["Colname"]
//yes
dt.ColnameColumn
//no
dt[0].IsNull("Colname")
//yes
dt[0].IsColnameNull()

最新更新