public DataRelation ( string relationName, // DataRelationの名前 System.Data.DataColumn parentColumn, // 関連の親の列 System.Data.DataColumn childColumn // 関連の子の列 );DataRelation(String, DataColumn, DataColumn) - DataRelation Constructor (System.Data) | Microsoft Learn
relationNameをnullまたは空文字列とすると、DataRelationCollectionに追加したときに"Relation1"のような既定の名前が与えられます。
DataSetに追加していないテーブルの列を指定すると、「親の列または子の列が DataSet にない場合は、DataRelation を作成できません。」としてInvalidConstraintExceptionが投げられます。
DataSet dataSet = new DataSet(); DataTable tableA = dataSet.Tables.Add("parent"); DataTable tableB = dataSet.Tables.Add("child"); tableA.Columns.Add("col1"); tableA.Columns.Add("id"); tableB.Columns.Add("id"); tableB.Columns.Add("col2"); tableA.Rows.Add("val1", "10"); tableA.Rows.Add("val2", "20"); tableB.Rows.Add("20", "val3"); DataRelation relation = new DataRelation( "rel", tableA.Columns["id"], tableB.Columns["id"]); relation.Nested = true; dataSet.Relations.Add(relation);
このDataSetに対してWriteXml()を呼び出すと、
dataSet.WriteXml("sample.xml"); dataSet.WriteXmlSchema("sample.xsd");
次のように出力されます。
<?xml version="1.0" standalone="yes"?> <NewDataSet> <parent> <col1>val1</col1> <id>10</id> </parent> <parent> <col1>val2</col1> <id>20</id> <child> <id>20</id> <col2>val3</col2> </child> </parent> </NewDataSet>
<?xml version="1.0" standalone="yes"?> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="parent"> <xs:complexType> <xs:sequence> <xs:element name="col1" type="xs:string" minOccurs="0" /> <xs:element name="id" type="xs:string" minOccurs="0" /> <xs:element name="child" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="id" type="xs:string" minOccurs="0" /> <xs:element name="col2" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> <xs:unique name="Constraint1"> <xs:selector xpath=".//parent" /> <xs:field xpath="id" /> </xs:unique> <xs:keyref name="rel" refer="Constraint1" msdata:IsNested="true"> <xs:selector xpath=".//child" /> <xs:field xpath="id" /> </xs:keyref> </xs:element> </xs:schema>
またRelationが設定されたテーブルへは、次のようにアクセスできます。
DataRow[] rows0 = tableA.Rows[0].GetChildRows(relation); DataRow[] rows1 = tableA.Rows[1].GetChildRows(relation); int length0 = rows0.Length; // 0 int length1 = rows1.Length; // 1 object item0 = rows1[0][0]; // 20 object item1 = rows1[0][1]; // "val3"
型 | プロパティ | 内容 |
---|---|---|
string | RelationName | Relationの名前 |
bool | Nested | trueならば、ネストされている。XMLとして書き出すときに作用する。既定はfalse |
DataTable | ParentTable | このRelationの親テーブル |
DataTable | ChildTable | このRelationの子テーブル |
DataColumn[] | ParentColumns | このRelationの親の列 |
DataColumn[] | ChildColumns | このRelationの子の列 |
ForeignKeyConstraint | ChildKeyConstraint | RelationのForeignKeyConstraint |
UniqueConstraint | ParentKeyConstraint | Relationの親列が唯一であることを保証するUniqueConstraint |
次のようにRelationが設定されたDataTableのDataRelationは、次の値となります。
DataSet dataSet = new DataSet(); DataTable tableA = dataSet.Tables.Add("tableA"); DataTable tableB = dataSet.Tables.Add("tableB"); DataColumn columnA = tableA.Columns.Add("columnA"); DataColumn columnB = tableB.Columns.Add("columnB"); DataRelation relation = dataSet.Relations.Add(columnA, columnB); string name = relation.RelationName; // "Relation1" DataTable table1 = relation.ParentTable; // {tableA} DataTable table2 = relation.ChildTable; // {tableB} DataColumn[] columns1 = relation.ParentColumns; // {columnA} DataColumn[] columns2 = relation.ChildColumns; // {columnB}
パフォーマンスを優先するならば、trueとします。DataRelation の入れ子化 - ADO.NET | Microsoft Learn
これがtrueのとき、
これがfalseのとき、
Nestedの有効/無効で、下表のような出力の相違があります。
DataSet dataSet = new DataSet(); DataTable tableA = dataSet.Tables.Add("A"); DataTable tableB = dataSet.Tables.Add("B"); DataColumn columnA = tableA.Columns.Add("id"); DataColumn columnB = tableB.Columns.Add("id"); DataRelation relation1 = dataSet.Relations.Add(columnA, columnB); dataSet.WriteXmlSchema("sample1.xsd"); relation1.Nested = true; dataSet.WriteXmlSchema("sample2.xsd");
false | true |
---|---|
<?xml version="1.0" standalone="yes"?> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="A"> <xs:complexType> <xs:sequence> <xs:element name="id" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="B"> <xs:complexType> <xs:sequence> <xs:element name="id" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> <xs:unique name="Constraint1"> <xs:selector xpath=".//A" /> <xs:field xpath="id" /> </xs:unique> <xs:keyref name="Relation1" refer="Constraint1"> <xs:selector xpath=".//B" /> <xs:field xpath="id" /> </xs:keyref> </xs:element> </xs:schema> |
<?xml version="1.0" standalone="yes"?> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="A"> <xs:complexType> <xs:sequence> <xs:element name="id" type="xs:string" minOccurs="0" /> <xs:element name="B" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="id" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> <xs:unique name="Constraint1"> <xs:selector xpath=".//A" /> <xs:field xpath="id" /> </xs:unique> <xs:keyref name="Relation1" refer="Constraint1" msdata:IsNested="true"> <xs:selector xpath=".//B" /> <xs:field xpath="id" /> </xs:keyref> </xs:element> </xs:schema> |
Relationが設定されたテーブルへの影響は、このForeignKeyConstraintによって決定されます。