Autor Beitrag
Tedd
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mi 29.10.14 00:09 
Hallo Zusammen,

ich bin neu hier im Forum und beschäftige mich seit kurzen mit der C#-Programmierung und habe auch vor ein kleines Projekt umzusetzen. Ich versuche eine Anwendung zu programmieren, dieses auf ein XML-File zugreift, in diesem Botschaften aufgelistet sind. Die Botschaften stellen einen IST-Wert dar und sollen mit einer Datenbank (Soll-Wert) abgeglichen werden.

Mit welchem Tool kann ich auf ein XML zugreifen und (mit welchem zweiten Tool) einen Abgleich mit einer Datenbank schaffen?

Zum Einlesen habe ich schon vieles im Internet gefunden, aber nichts davon scheint passend zu sein.
Denn ich muss jede einzelne Botschaft "rauspicken" und dann mit einem Datenbankeintrag abgleichen.

Ich hoffe ihr könnt mich ein wenig unterstützen...

Danke vorab !!!
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mi 29.10.14 01:59 
Such mal nach Serialisierung, in deinem Fall XML Serialisierung. Gibt mehr als genug zu finden, mit diesem Stichwort.
Schwer ist es auch nicht, Grundlagen brauchst du aber trotzdem ;)


Bei Datenbanken läuft das nicht so einfach ab, es gibt mehrere Möglichkeiten.
Zuerst musst du die ein Datenbank-System aus suchen (ich empfehlen LocalDb, ist einfach, aktuell und braucht keinen kompletten Server).
Dann musst du dir überlegen, wie du darauf zu greifst. Da gibt es mehrere Möglichkeiten, beginnend bei reinem SQL, DataSets von ADO.NET bis zu Object Relation Mappern (ORM). Das reine SQL an die Datenbank zu schicken, dürfte das einfachste sein, hat aber auch den großen Nachteil, dass du alles alleine machen musst. ADO.NET schickt dann das SQL-Script nur an die Datenbank und gibt dir eventuelle Ergebnisse zurück.
DataSets verinfachen das ganze etwas (sagen zumindest andere :D). Ich kenne mich damit nur wenig aus und das bisschen, was ich kenne, mag ich nicht.
Mein Favorit sind OR-Mapper. Davon gibt es mehrere, auch im .NET-Framework. Zur Zeit spiele ich gerne mit dem ADO.NET Entity Framework rum. Ich lese/höre manchmal, das sei vergleichsweise unperformant, aber wenn es nicht gerade um zig tausend Datensätze in kurzer Zeit geht, ist das zu vernachlässigen. Besser ist da die extreme Verinfachung. Das Entity Framework kann auf verschiedene Weise genutzt werden, am einfachsten und praktischsten (weil fast alles automatisiert wird) ist der Code First-Ansatz, wo du im Prinzip nur noch die Klasse erstellst und das Entity Framework macht alles danach alleine - sogar die Datenbank erstellen. Ein schönes Tutorial, das nicht so umfangreich ist, wie die Variante von Microsoft, ist Dieses. Das ist allerdings auf Englisch, die besten Quellen findet man aber sowieso nur auf Englisch.
Je nachdem, was du brauchst, musst du dir überleg, wie du vorgehst und was du nutzt. Für eine einfache (Übungs)-Anwendung für Zuhause reicht die Kombination LocalDB und ENtity Framework 6.x komplett aus und du musst dich kaum noch um eine Datenbank kümmern.

Allgemein empfehle ich dir auch dieses Buch.
Wenn du das durch gelesen und verstanden hast, weißt du eigentlich alles, um dich alleine weiter zu bilden und mehr.
Da werden alle Grundlagen dargestellt, inklusive (XML) Serialisierung, WPF, DataSets und dem Entity Framework.
Der Code First-Ansatz wird allerdings nicht erklärt, sondern der Database First-Ansatz, für den (wie der Name schon sagt) erst die Datenbank existieren muss.

PS:
LINQ wird auch gezeigt, wohl eines der praktischsten Features in .NET
Du hast es wahrscheinlich schon genutzt (in Verbindung mit allen möglichen Auflistungen von Objekten) ohne es zu wissen.
Bei dem Entity Framework wird das auch ausgesprochen nützlich sein.

Für diesen Beitrag haben gedankt: Tedd
Tedd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mi 29.10.14 21:58 
Hallo Palladin007,

erstmal ein grosses Dankeschön, dass du so schnell und ausführlich geantwortet hast.
Ich habe mir die LocalDB bereits als Datenbankoption angeschaut und es wirklich top vom Handling her.

Ich werde LocalDB wahrscheinlich auch anwenden.

Was mir noch nicht so ganz klar ist, ist die XML Serialisierung...und zwar:

Klar kann ich damit XML-Dateien umwandeln, aber wie kann ich dann daraus die einzelnen Botschaften entnehmen, um diese dann mit der Datenbank abzugleichen? Im Enddefekt muss jede einzelne Botschaft einem Datenbankeintrag zugeordnet werden und dann erfolgt der Abgleich, ob IST = SOLL ist. Kannst du mir hierzu noch einen Lösungsansatz mit auf den Weg geben?

Besten Dank im Voraus.
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mi 29.10.14 22:11 
Prinzipiell ist ja der Ansatz:

1. Aus der Datenbank Objekte generieren
2. Aus der XML-Datei Objekte generieren
(wenn da wirklich quasi das gleiche drin steht, kannst du vielleicht sogar die gleiche Klasse hernehmen)
3. Schreibe eine Methode, die bewertet ob zwei Objekte gleich sind.

Ich hoffe einmal, dass deine Datensätze eine Art ID haben. dann könnte das auch irgendwie so aussehen (ganz grob)
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
List<xmlEntity> xmlData = xmlSerializer.Deserialize();

foreach (var item in xmlData)
{
    var entity = db.Bla.Find(item.ID);
    if (entity.Equals(item))
       Console.WriteLine("Gleich!");
}


Alternativ die XML-Daten in ein Dictionary<> und dann alle Datensätze aus der DB durchlaufen und gegen prüfen.

Wenn du zwischen XML-Datensätzen und Datenbank-Datensätzen keine direkte Zuordnung vornehmen kannst, wird es deutlich komplexer (und langsamer).

Für diesen Beitrag haben gedankt: Tedd
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mi 29.10.14 22:35 
Hallo Tedd,

das mach .NET für dich.
Wenn du nach "XML Serialisierung" gesucht hättest, dann hättest du folgenden Link finden können:
code-bude.net/2012/0...serialisierung-in-c/

Den Code dort würde ich jetzt nicht 1 zu 1 übernehmen, aber es wird dennoch erklärt.
Ich nutze immer diese zwei Methoden:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
public static void SerializeFile<T>(string path, T obj)
    where T : new()
{
    var serializer = new XmlSerializer(typeof(T));
    using (var file = new FileStream(path, FileMode.Create))
        serializer.Serialize(file, obj);
}
public static T DeSerializeFile<T>(string path)
    where T : new()
{
    var serializer = new XmlSerializer(typeof(T));
    using (var file = new FileStream(path, FileMode.Open))
        return (T)serializer.Deserialize(file);
}


Serialisieren Objekte in eine XML-Datei bzw. deserialisieren die Datei wieder in ein Objekt.
Voraussetzung ist, dass das Objekt mit XML serialisierbar ist, das Dictionary ist es zum Beispiel nicht. Im Internet gibt es aber ein paar Beispiele, wie man das ändern kann.
Außerdem müssen die Properties komplett public sein und es muss ein parameterloser Konstruktor existieren.

Eine Option ist auch, IXmlSerializable zu implementieren.
So lässt sich auch das Dictionary serialisierbar machen und es können sogar komplett private Member beachtet werden.
Ein Parameterloser Konstruktor muss aber trotzdem existieren.

Für diesen Beitrag haben gedankt: Tedd
Tedd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Do 30.10.14 21:15 
Hallo Palladin007,

den Link habe ich auch gefunden gehabt, doch konnte damit nur bedingt etwas anfangen, weil (das hatte ich vergessen zu erwähnen) das XML vom C# Programm geladen werden muss. Ich habe zwar schon einen Weg gefunden, wie man ein XML zu C# laden kann, allerdings wird dabei das XML-File nur in einem Layer angezeigt. Da stellt sich mir wieder mal eine Frage und zwar: "Ist das der richtige Weg?:-) ". Das XML muss immer neu in die Anwendung geladen werden können, da sich die Inhalte vom XML durchaus ändern können.

In der Datenbank sind ungefähr 100 Botschaften hinterlegt und das XML beinhaltet immer ungefähr 30 davon. Beim nächsten Einlesen können es also dann wieder theoretisch 30 komplett andere Botschaften sein.

Oh man.. :-) Ich hoffe du hast noch ein wenig Geduld für etwas Support :-)
Tedd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Do 30.10.14 21:35 
Ich glaube ich brauche ein Dataset, habe ich grad in einer Quelle gelesen. Es muss also machbar sein, dass per Button-Betätigung der Speicherort vom XML angezeigt wird, dieses dann eingelesen wird und dann kann ich loslegen mit den .NET, um die einzelnen Botschaften mit der Datenbank abzugleichen. Oder :-) ?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 30.10.14 22:18 
Zitat:
Ich glaube ich brauche ein Dataset, habe ich grad in einer Quelle gelesen.

Wenn du nur aus der DB lesen musst ist ein Dataset zuviel des guten. Selbst eine DataTable wäre wenn du nur aus einer Tabelle lesen mußt übertrieben.
Da reicht ein simpler DataReader (bei LocalDB ein SqlDataReader) der die Tabelle ausliest und du die ~Botschaften~ (was auch immer gemeint ist, ein string?) in eine Datenstruktur packst wie sie hier im Thread schon empfohlen wurde.

Für diesen Beitrag haben gedankt: Tedd
Tedd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Do 30.10.14 22:41 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
Ich glaube ich brauche ein Dataset, habe ich grad in einer Quelle gelesen.

Wenn du nur aus der DB lesen musst ist ein Dataset zuviel des guten. Selbst eine DataTable wäre wenn du nur aus einer Tabelle lesen mußt übertrieben.
Da reicht ein simpler DataReader (bei LocalDB ein SqlDataReader) der die Tabelle ausliest und du die ~Botschaften~ (was auch immer gemeint ist, ein string?) in eine Datenstruktur packst wie sie hier im Thread schon empfohlen wurde.


Hallo Ralf,

danke für den Hinweis, aber das Dataset war auf das XML einlesen bezogen. Oder habe ich nun was verwechselt?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 30.10.14 23:08 
Ein DataSet kann auch mit Xml umgehen. Das ist aber ein sehr spezielles Xml. Eher ein reines intermediate Format um mal schnell den Zustand des Datasets wegzusserialisieren unabhängig von der eigentlichen relationalen Quelle. Also nichts das dir hier helfen könnte.

Für das xml solltest du dir den ebenfalls schon empfohlen XmlSerializer ansehen. Alternativ gehts auch mit Linq2Xml. Macht aber nur Sinn wenn du schon ungefähr weiß was Linq ist. Sonst wäre es nur eine weiter unbekannte auf dem Haufen der unbekannten mit dem du scheinbar konfrontiert bist ;)
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Fr 31.10.14 00:03 
Zitat:
Das XML muss immer neu in die Anwendung geladen werden können, da sich die Inhalte vom XML durchaus ändern können.


Kein Problem, lade sie einfach immer und immer wieder :D
Der XmlSerializer liest die Datei ein und setzt anschließend für ein Objekt mit dem von dir angegeben Typ die im XML enthaltenen Werte für die Eigenschaften vom Objekt.
Das Objekt ist danach eigenständig und unabhängig, was mit der Datei passiert, ist total egal.

Probiere es doch einfach mal aus. Du kannst uns das schon glauben und schaden tut's auch nicht.


LINQ to XML ist natürlich auch eine Möglichkeit, allerdings auch deutlich umfangreicher zu nutzen.
Dort wird nur für jedes XML-Element eine Objekt-Repräsentation im Speicher angelegt und wie du deine Daten darin dann findest, musst du selber regeln.
Für XML-Dokumente, die kein festes Schema haben, das sich nicht auf ein Klassenschema abbilden lässt, da wäre LINQ to XML ein besser geeignetes Werkzeug.


In deinem Fall klingt das eher so, dass es eine Art Liste mit Botschaften ist, die eingelesen werden soll.
Eine Liste ist prinzipiell kein Problem, solange das XML-Dokument dem Schema folgt.
Wenn dann noch Daten existieren, mit denen diese Botschaften den Werten in der Datenbank zugeordnet werden können, sehe ich kein Problem.

Sollte aber das XML-Dokument so schräg aufgebaut sein, das der XMLSerializer versagt und du kannst das Schema nicht ändern, dann brauchen wir ein Beispiel um sinnvoll helfen zu können.
Tedd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: So 02.11.14 20:42 
Super...dann vielen Dank Zusammen. Ich versuche nun mal die Lösungsansätze umzusetzen....
Tedd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Do 04.12.14 19:35 
Hallo Zusammen,

ich habe mich nun zu der Umsetzung für Lina entschieden. Einlesen tue ich das XML-File über openfiledialog und werte dieses dann mit Xdocument aus.Nun erneut meine Frage: " Wie kann ich ein XML-Knoten mit einer Botschaft aus der Datenbank gegenüber stellen?"

Könnte mir jemand einen Tipp geben?
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Do 04.12.14 22:24 
Du hast deine XML-Quelle und eine Liste mit Daten und du hast eine Datenbank, aus der du eine Liste mit Daten bekommst. Wie Letzteres geht, gibt es unzählige Quellen im Internet, aber schau mal nach dem Stichwort Object Relation Mapper und such nach Entity Framework.

Dann hast du zwei Listen und kannst sie vergleichen.
Wie du das machst, bleibt dir überlassen.

Für diesen Beitrag haben gedankt: Tedd
Tedd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Fr 05.12.14 00:20 
Hallo Palladin,

das war echt super Tipp. Genau das klingt für mein Vorhaben perfekt geeignet. Ich schau mir das mal in Ruhe an :-)

Besten Dank für deine schnelle Antwort...
Tedd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mo 05.01.15 16:26 
Hallo Zusammen,

gibt es Tools in C#, dies erkennen kann, ob ein neuer Eintrag in dem XML vorliegt und wenn ja, diesen dann rausnimmt und mit der Datenbank vergleicht?

Gruß
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 05.01.15 19:24 
Was meinst du mit neu?
Was neu ist, das muss du fest legen, das wird in der Regel mit einem eigenen Feld realisiert, in Datenbanken gibt's dafür häufig ein CreatedOn und ChangedOn Feld vom Typ Date. Das gleiche lässt sich auch für XML realisieren.
Da kannst du dann rein schreiben, wann ein Datensatz erstellt bzw. geändert wurde.

Tools gibt es keine, außer du konkretisierst, was du meinst. Stur die Datenen vergleichen ist kein Problem, allerdings hast du dann das Problem, dass auch ein neues Leerzeichen ein Unterschied ist, was in XML aber unter Umständen irrelevant ist.
Du könntest auch ein Backup halten. Das Backup steht in der Datenbank und von dort vergleichst du es immer mit der XML und aktualisierst es. Stellst du dabei Änderung fest, kannst du dir merken, wo sie waren und anschließend aus dem backup heraus deine Berechnungen nur für die geänderten Datensätze durchführen.
Das ständige abgleichen der XML mit dem Backup kannst du ja von dem Änderungsdatum der Datei selber abhängig machen.
Tedd Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Di 13.01.15 22:35 
Hab mein Konzept nun ein wenig geändert und bin auch schon ein wenig weiter gekommen.
Bis hier hin erstmal besten Dank Palladin007.

Deswegen macht es wenig Sinn auf deine Fragen zu antworten.
Ich hoffe das klingt nicht unfreundlich ;-)

Bei meinen neuen Weg tun sich aber nun neue Fragen auf und zwar:

"Wie kann mit einem Button ein XML in ein treeView schreiben?

Also immer wenn ich diesen Button drücke, wird ein bestimmtes XML im treeView aufgerufen.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mi 14.01.15 00:26 
Eine feste Methode gibt es dafür wahrscheinlich nicht, das musst du schon selber machen ^^
Da kann ich dir auch nicht helfen, im Moment kennst du dich mit WinForms vermutlich besser aus als ich, ich bin WPF-Mensch :D

Grob stelle ich mir das aber so vor:
Du hast im TreeView TreeNode-Objekte. Diese Nodes haben einmal Content und einmal Items. Eventuell heißen die Properties anders, musst du mal danach suchen.
In die Content-Property kommt der Wert, der in einem XML-"Feld" steht, sind da weitere XML-Knoten drin und kein Wert, dann steht da der Name der aktuellen Knotens drin.
Für weitere Unter-Knoten im XML werden dann in der Items-Property weitere TreeNode-Objekte hinzugefügt und gleich behandelt - allerdings für die XML-Knoten eine Ebene tiefer.

LINQtoXML macht das sehr einfach, da kannst du genau in dieser Art und Weise durch laufen. Das lässt sich dann sogar sehr kompakt rekursiv lösen.