You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataSet调用GetChanges报错“找不到父级关系Rel”原因咨询

排查VB.NET调用GetChanges()时“找不到父关系Rel”错误原因

问题场景

以下VB.NET代码在调用tDetail.GetChanges()时触发错误:cannot find parent relation Rel,移除cOrder.Expression赋值语句则无错误:

Dim ds As New DataSet
Dim tMaster As New DataTable("TableMaster")
Dim idMPmaster As DataColumn = tMaster.Columns.Add("IdMP", GetType(String))
tMaster.Columns.Add("Order", GetType(Integer))
tMaster.PrimaryKey = New DataColumn() {idMPmaster}
ds.Tables.Add(tMaster)

Dim tDetail As New DataTable("TableDetail")
Dim cidDetail As DataColumn = tDetail.Columns.Add("id", GetType(Integer))
Dim cidMPDetail As DataColumn = tDetail.Columns.Add("idMP", GetType(String))
Dim cOrder As DataColumn = tDetail.Columns.Add("Order", GetType(Integer))
tDetail.PrimaryKey = New DataColumn() {cidDetail, cidMPDetail}
ds.Tables.Add(tDetail)
ds.Relations.Add("Rel", idMPmaster, cidMPDetail)

tMaster.Rows.Add("A", 10)
tMaster.Rows.Add("B", 20)
tMaster.Rows.Add("C", 30)

tDetail.Rows.Add(1, "A")
tDetail.Rows.Add(1, "B")
tDetail.Rows.Add(2, "B")
tDetail.Rows.Add(2, "C")
tDetail.Rows.Add(3, "A")
tDetail.Rows.Add(3, "B")
tDetail.Rows.Add(3, "C")

' 注释掉此行则无错误
cOrder.Expression = "Parent(Rel).Order"

' 此行触发错误:cannot find parent relation Rel
Dim changes As DataTable = tDetail.GetChanges()

错误原因

当给cOrder设置依赖父关系Rel的计算表达式后,调用GetChanges()会生成一个仅包含变更行的新DataTable,这个新表所属的临时DataSet不会自动复制原DataSet中的关系定义。计算列需要通过关系Rel关联父表获取数据,但新环境中找不到该关系,因此抛出错误。

解决办法

办法1:给变更数据的DataSet手动添加关系

获取变更表后,把原DataSet中的关系克隆一份添加到新DataSet中:

' 获取变更数据
Dim changes As DataTable = tDetail.GetChanges()
' 克隆原关系并添加到变更表所在的DataSet
changes.DataSet.Relations.Add(ds.Relations("Rel").Clone())

办法2:临时移除计算列表达式

在调用GetChanges()前先清空计算列表达式,获取完成后再恢复:

' 保存原表达式
Dim originalExpr As String = cOrder.Expression
' 临时移除表达式
cOrder.Expression = ""
' 获取变更数据
Dim changes As DataTable = tDetail.GetChanges()
' 恢复原表达式
cOrder.Expression = originalExpr

办法3:手动复制数据并保留关系

如果需要同时保留父表数据和关系,可以手动复制需要的行到新DataSet,并重新建立关系:

Dim newDs As New DataSet()
' 复制父表的变更或全部数据(按需选择)
Dim newMaster As DataTable = tMaster.GetChanges() Or tMaster.Copy()
newDs.Tables.Add(newMaster)
' 复制子表变更数据
Dim newDetail As DataTable = tDetail.GetChanges()
newDs.Tables.Add(newDetail)
' 重新建立关系
newDs.Relations.Add("Rel", newMaster.Columns("IdMP"), newDetail.Columns("idMP"))

内容的提问来源于stack exchange,提问作者Roberto Hernandez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 21:07:05