如果我使用DataAdapter填充DataSet,从Dataders和Customers中选择所有行并调用:
private void CreateRelation()
{
// Get the DataColumn objects from two DataTable objects
// in a DataSet. Code to get the DataSet not shown here.
DataColumn parentColumn =
DataSet1.Tables["Customers"].Columns["CustID"];
DataColumn childColumn =
DataSet1.Tables["Orders"].Columns["CustID"];
// Create DataRelation.
DataRelation relCustOrder;
relCustOrder = new DataRelation("CustomersOrders",
parentColumn, childColumn);
// Add the relation to the DataSet.
DataSet1.Relations.Add(relCustOrder);
}
(来自http://msdn.microsoft.com/en-us/library/system.data.datarelation.aspx)
如果订单没有客户,则会出现运行时错误.当有缺陷的程序在客户被删除时没有删除客户的订单时,可能会发生这种情况.
我可以做什么,除了将Orders选择字符串另外的where-condition:
CUSTID IN (SELECT DISTINCT CUSTID FROM CUSTOMERS)
或者:这是真的那样(所有孩子都必须有父母)?我的代码也可能有bug.在IN MY CODE中我将关系添加到填充的DataSet时发生异常.例外是:
System.Data.dll中发生了未处理的"System.ArgumentException"类型异常
附加信息:无法启用此约束,因为并非所有值都具有相应的父值.
谢谢和最诚挚的问候 - 马蒂
Add()方法有一个重载,它包含一个bool值来强制执行约束.我想我过去曾经这样用过:
DataRelation dr = ds.Relations.Add("name", DataColumnParent, DataColumnChild, false);
Run Code Online (Sandbox Code Playgroud)
编辑
对不起,唯一的重载是这个方法签名:http://msdn.microsoft.com/en-us/library/3zy636kc.aspx
DataRelationCollection.Add(String, DataColumn[], DataColumn[], bool)
Run Code Online (Sandbox Code Playgroud)