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
相关产品推荐
相关产品推荐

