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
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.
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;
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
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
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
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