Laden...

Relation zwischen 2 Tabellen (DataSet)

Erstellt von Manda vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.071 Views
M
Manda Themenstarter:in
5 Beiträge seit 2010
vor 14 Jahren
Relation zwischen 2 Tabellen (DataSet)

Hallo zusammen,
kurz vor weg: bin ein Anfänger in C# und hoffe das ich im richtigen Bereich bin.
Problem:
Ich habe eine Tabelle Person(Id,Name,Vorname)
und eine Tabelle Task(Id, Start, Ende, Dauer). Diese möchte ich nun mit einer Tabelle 'Relation' verbinden.
Ich müsste also die ID von Person mit der ID von Task als Relation darstellen. Leider weisß ich nicht, wie ich da vorgehen soll.
Ich schreibe das in eine XML-Datei raus(Tabelle Person und Task) und lese diese anschließend wieder ein. Einfach nur zur Übung.

Hier der Code: Person-Tabelle


protected void CreateUpdatePerson()
        {
            PrintMsg(null, "Create new Person");
            m_DataTablePerson = new DataTable(m_sTablePerson);

            // --- Create Columns
            m_DataTablePerson.Columns.Add(_sColID);
            m_DataTablePerson.Columns.Add(_sColName);
            m_DataTablePerson.Columns.Add(_sColVorname);

            // ---Add DataTable to DataSet
            m_TheDataSet.Tables.Add(m_DataTablePerson);

            PrintMsg(null, "New Person Created");

            // --------------------------------------------------------------------------
            PrintMsg(null, "Insert Person");

            // --- Create Row
            DataRow drNewRow  = m_DataTablePerson.NewRow();
            DataRow drNewRow1 = m_DataTablePerson.NewRow();

            // --- fill rows
            drNewRow[_sColID]       = 1;
            drNewRow[_sColName]     = "Meyer";
            drNewRow[_sColVorname]  = "Klaus";

            drNewRow1[_sColID]      = 2;
            drNewRow1[_sColName]    = "Otto";
            drNewRow1[_sColVorname] = "Maus";

            // --- Add rows to Table
            m_DataTablePerson.Rows.Add(drNewRow);
            m_DataTablePerson.Rows.Add(drNewRow1);

            PrintMsg(null, "Person inserted");
        } 

Hier der Code: Task-Tabelle


protected void CreateUpdateTask()
        {
            PrintMsg(null, "Create new Task");
            m_DataTableTask = new DataTable(m_sTableTask);

            // --- Create Columns
            m_DataTableTask.Columns.Add(_sColID);
            m_DataTableTask.Columns.Add(_sColStart);
            m_DataTableTask.Columns.Add(_sColEnd);
            m_DataTableTask.Columns.Add(_sColDuration);

            // --- Add DataTable to DataSet
            m_TheDataSet.Tables.Add(m_DataTableTask);

            PrintMsg(null, "New Task created");

            // ------------------------------------------------------------------
            PrintMsg(null, "Update data");

            //--- Create Row
            DataRow drNewRow  = m_DataTableTask.NewRow();
            DataRow drNewRow1 = m_DataTableTask.NewRow();

            //--- fill rows
            drNewRow[_sColID]        = 1;
            drNewRow[_sColStart]     = System.DateTime.Now;
            drNewRow[_sColEnd]       = System.DateTime.Now;
            drNewRow[_sColDuration]  = 20;

            drNewRow1[_sColID]       = 2;
            drNewRow1[_sColStart]    = System.DateTime.Now;
            drNewRow1[_sColEnd]      = System.DateTime.Now;
            drNewRow1[_sColDuration] = 10;

            //--- Add rows to Table
            m_DataTableTask.Rows.Add(drNewRow);
            m_DataTableTask.Rows.Add(drNewRow1);

            PrintMsg(null, "Data updated");
        }
 

Nun stehe ich hier:


protected void BuildRelation()
        {
            PrintMsg(null, "...Create new Relation");

            if (m_TheDataSet == null) return;

            m_DataTableRelation = new DataTable(m_sTableRelation);
                                 
            /*
            // --- Create Columns UNSICHER OB ICH DIE COLUMNS BRAUCHE?!?!
            m_DataTableRelation.Columns.Add(_sColID);
            m_DataTableRelation.Columns.Add(_sColFromId);
            m_DataTableRelation.Columns.Add(_sColFromType);
            m_DataTableRelation.Columns.Add(_sColToId);
            m_DataTableRelation.Columns.Add(_sColToType);
            */
        } 

Bei der Methode: BuildRelation komme ich leider nicht weiter, hoffe Ihr könnt mir da helfen:).

Gruß
Manda

J
3.331 Beiträge seit 2006
vor 14 Jahren

Hallo und willkommen,

guckst du in :rtfm: DataRelation. Dann findest du u.a. Beispiele, am besten im Bereich Konstruktor: Für eine DataRelation werden die beteiligten Tabellen (per Name, also String) und die beteiligten Spalten (wahlweise als DataColumn oder Spaltenname oder auch als Arrays) angegeben.

Einfach noch etwas mehr in :rtfm: stöbern!

Gruß Jürgen

PS. Was glaubst du wohl, welchen Zweck das Unterforum Datentechnologien hat?

PS 2. Was macht wohl die folgende Zeile:

m_DataTableRelation = new DataTable(m_sTableRelation);

Du erzeugst eine neue DataTable? Wo ist denn der dort eingetragene Name festgelegt? Was hat eine neue DataTable mit einer DataRelation zu tun?

PS 3. Deine Variablennamen solltest du überdenken, siehe .NET Richtlinien für Namen. Unter anderem ist die ungarische Notation zu vermeiden.

M
Manda Themenstarter:in
5 Beiträge seit 2010
vor 14 Jahren

Hallo Jürgen,

mit dieser Zeile:

m_DataTableRelation = new DataTable(m_sTableRelation);

gebe ich der Tabelle Relation einfach nur einen Namen.

Ich habe ein DataSet wo ich dann 3 Tabellen hätte (Task, Person und Relation). Wo ich unsicher bin ist die Relation-Tabelle. Ich weiß nicht ob ich diese überhaupt anlegen muss?

Ich dachte vielleicht an soetwas: in der Funktion BuildRelation()


// --- get relations
            string sWhere = string.Format("{0}={1}", m_DataTableTask.Columns[_sColID], m_DataTablePerson.Columns[_sColID]);            
            DataRow[] aDrRelation = m_DataTableRelation.Select(sWhere);

            if (aDrRelation == null || aDrRelation.Length == 0)
                return; 

2.223 Beiträge seit 2005
vor 14 Jahren

Hallo Manda und Herzlich Willkommen hier im Forum,

bei den Relationen, mußt du schon die Columns aus den beiden zugrunde liegenden Tabellen benutzen und nichts neu erstellen.

PK: id
FK: startbahnhoefeid



DataTable bahnhoefeTable = new DataTable();
bahnhoefeTable.Name = "bahnhoefe";
//spalten zu der bahnhoefeTable hinzufügen


DataTable kurzstreckenTable = new DataTable()
kurzstreckenTable.Name = "kurzstrecken";
//spalten zu der kurzstreckenTable hinzufügen


DataSet ds = new DataSet();

ds.Tables.Add(bahnhoefeTable);
ds.Tables.Add(kurzstreckenTable);

ds.Relations.Add(new DataRelation("bahnhoefe_kurzstrecke", ds.Tables["bahnhoefe"].Columns["id"], ds.Tables["kurzstrecken"].Columns["startbahnhoefeid"]));

Viele Grüße
Lars

J
3.331 Beiträge seit 2006
vor 14 Jahren

Dann hast du anscheinend ein großes Verständnisproblem. Eine **DataRelation **ist keine Tabelle (DataTable), sondern es stellt - genau wie ein ForeignKey in einer Datenbank - eine Verknüpfung her zwischen zwei vorhandenen Tabellen über passende Spalten. Dein Ansatz über "new DataTable" ist völlig abwegig.

Also nochmals: :rtfm: **DataRelation **(Konstruktor). Eine DataRelation ist übrigens Bestandteil des DataSet, aber nicht von DataSet.Tables, sondern von DataSet.Relations (was ebenfalls deutlich macht, dass es etwas völlig Anderes ist).

Jürgen

M
Manda Themenstarter:in
5 Beiträge seit 2010
vor 14 Jahren

Hallo Lars,

Danke für das Bsp! Ich hatte wohl ein Verständnis Problem. Dachte das ich eine neue Tabelle erstellen muss.

Danke auch an Jürgen! Ist nun klarer geworden. Ich mach mich da mal ran, falls ich noch Fragen haben sollte, würde ich mich wieder melden.

Gruß
Manda

M
Manda Themenstarter:in
5 Beiträge seit 2010
vor 14 Jahren

Wenn jemand noch mal kurz drüber schauen würde, damit ich mir sicher bin, dass ich ds jetzt doch richtig mache 😃


protected void BuildRelation()
        {
            PrintMsg(null, "...Create new Relation");

            if (m_TheDataSet == null) return;
                      
            /*
            // --- get relations
            string sWhere = string.Format("{0}={1}", m_DataTableTask.Columns[_sColID], m_DataTablePerson.Columns[_sColID]);            
            DataRow[] aDrRelation = m_DataTableRelation.Select(sWhere);

            if (aDrRelation == null || aDrRelation.Length == 0)
                return;
            */
            
            // --- Create DataRelation
            m_DataRelation = new DataRelation("Person-Task",
                                          m_TheDataSet.Tables[m_sTableTask].Columns[_sColID],
                                          m_TheDataSet.Tables[m_sTablePerson].Columns[_sColID]
                                          );
            m_TheDataSet.Relations.Add(m_DataRelation);
            
            PrintMsg(null, "Person-Task");
            PrintMsg(null, "New Relation created");
        }

Frage: Was mache ich wenn ich sagen will, dass ein 'Task' einen weiteren 'Untertask' hat? Da ich das später als Baumstruktur ausgeben will.
Wie: Person -> Task_1 und Gleiche Person -> Task_2
Und: Task_1 hat Task_1_1

Darum dachte ich, dass meiner Ansatz (auskommentiert) vielleicht sowas erzeugen könnte. Bitte korrigieren, wenn ich falsch liege.

Danke.

Gruß
Manda