Beispiel zu: DataTable Relationen im Speicher traversieren

Thomas Darimont

Erfahrenes Mitglied
Hallo!

Hier mal ein kleines Beispiel wie man über die Relations einer DataTable von einer DataRow aus traversieren kann:
C#:
using System;
using System.Collections.Generic;
using System.Text;
using DataTable = System.Data.DataTable;
using DataRow = System.Data.DataRow;
using DataColumn = System.Data.DataColumn;
using DataRelation = System.Data.DataRelation;
using DataSet = System.Data.DataSet;
using DataView = System.Data.DataView;

namespace De.Tutorials.Training
{
    public class InMemoryMappingExample
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("InMemoryMappingExample");
            DataTable articleTable = CreateDummyTable("article", new string[] { "ID", "VALUE" }, new object[][] { new object[] { 1, "Gummibärchen" }, new object[] { 2, "Bitburger" }, new object[] { 3, "Colorado" }, new object[] { 4, "Salami" } });
            DataTable groupTable = CreateDummyTable("group", new string[] { "ID", "VALUE" }, new object[][] { new object[] { 1, "SÜßWaren" }, new object[] { 2, "Bier" }, new object[] { 3, "Wurst" } });
            DataTable articleGroupMappingTable = CreateDummyTable("articleGroupMapping", new string[] { "MAPPING_ID", "LEFT_ID", "RIGHT_ID" }, new object[][] { new object[] { 1, 1, 1 }, new object[] { 2, 2, 2 }, new object[] { 3, 3, 1 }, new object[] { 4, 4, 3 } });
            DataSet dataSet = new DataSet("joinedDataSet");

            DataView mappingDataView = dataSet.DefaultViewManager.CreateDataView(articleGroupMappingTable);
            mappingDataView.Sort = "RIGHT_ID ASC";
            articleGroupMappingTable = mappingDataView.ToTable();
                        
            dataSet.Tables.Add(articleTable);
            dataSet.Tables.Add(groupTable);
            dataSet.Tables.Add(articleGroupMappingTable);

            articleTable.ChildRelations.Add("article", articleTable.Columns["ID"], articleGroupMappingTable.Columns["LEFT_ID"]);
            groupTable.ChildRelations.Add("articleGroup", groupTable.Columns["ID"], articleGroupMappingTable.Columns["RIGHT_ID"]);

            foreach (DataRow mappingDataRow in articleGroupMappingTable.Rows)
            {
                PrintRow(mappingDataRow);
            }
        }

        private static void PrintRow(DataRow mappingDataRow)
        {
            StringBuilder buffer = new StringBuilder();

            DataRow articleGroupDataRow = mappingDataRow.GetParentRow("articleGroup");

            buffer.Append("Group: ");
            buffer.Append(articleGroupDataRow["ID"]);
            buffer.Append(" ");
            buffer.Append(articleGroupDataRow["VALUE"]);

            DataRow articleDataRow = mappingDataRow.GetParentRow("article");

            buffer.Append(" Article: ");
            buffer.Append(articleDataRow["ID"]);
            buffer.Append(" ");
            buffer.Append(articleDataRow["VALUE"]);

            Console.WriteLine(buffer);
        }

        private static DataTable CreateDummyTable(string tableName, string[] columnNames, object[][] rowData)
        {
            DataTable dataTable = new DataTable();
            dataTable.TableName = tableName;

            foreach (string columnName in columnNames)
            {
                DataColumn dataColumn = new DataColumn(columnName);
                dataTable.Columns.Add(dataColumn);
            }

            foreach (object[] row in rowData)
            {
                dataTable.Rows.Add(row);
            }

            return dataTable;
        }
    }
}

Gruß Tom
 

Ignus

Mitglied
Was heist "traversieren"?
Jeder wirft zwar damit um sich (selbst in der .NET Hilfe), aber nirgends steht genau was das Wort nun heist/bedeutet.

Zudem finde ich es zwar gut wenn due hier solche Beispiele bringst, aber ohne Beschreibung dazu in den einzelnen Codeabschnitten, finde ich es etwas zu mühsam mir deinen Code im Detail anzuschauen. Besonders mir als Anfänger fällt sowas dann recht schwer.
 

Thomas Darimont

Erfahrenes Mitglied
Hallo,

Travsersieren kommt vom englischen traverse und bedeutet in diesem Zusammenhang soviel wie durchlaufen / ablaufen. Ich versuche meine Beispiele möglichst kurz zu halten und mit aussagekräftigen Methoden- und Variablennamen auszustatten so dass sie weitgehend selbsterklärend sind. Ich halte es für unnötig Kommentare zu schreiben die man auch in der MSDN Doku nachlesen kann.

Gruß Tom