Laden...

Ideale Datenspeicherung für Vokabeltrainer

Erstellt von Shinzo vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.984 Views
S
Shinzo Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren
Ideale Datenspeicherung für Vokabeltrainer

Hallo,

ich habe vor, einen Vokabeltrainer auf Basis von Windows Forms zu programmieren. Hatte mir schon überlegt, es mit WPF zu machen, hab mich dann allerdings dagegen entschieden. Denn bei der Arbeit beschäftige ich mich auch mit Windows Forms und WPF mit XAML wäre totales Neuland für mich. Außerdem studiere ich Kommunikationstechnik, da ist fürs Studium eigentlich eher C/C++ vorgesehen, daher möchte ich mich da nicht all zu weit in die andere Richtung lehnen. C# mit Windows Forms reicht da aus. 😉

Nun aber zu meiner Frage:

Um die Daten abzulegen, muss ich mich ja für ein Format entscheiden. Was würdet ihr da wählen? Ich dachte an eine XML Struktur, da ich neben den beiden Wörter noch andere Dinge dazu abspeichern muss, z. Bsp. wie oft ein Wort nicht gewusst wurde, in welcher Phase es sich gerade befindet, etc.

Wenn ich es in einer XML Datei speichern sollte, wie sollte ich mir die Daten dann zur Laufzeit am besten vorhalten? Was wäre da geeignet? Ein mehrdimensionaler Array ala Vokabeln[,,,] wäre zwar sicher einfach, allerdings gehe ich doch davon aus, dass es da sicher elegantere Methoden gibt, oder?

Wie viel Speicher das verbraucht sehe ich eigentlich nicht als Kriterium, da selbst wenn über 1000 Vokabeln gespeichert sind es nichts ausmacht, wenn die Datei dann ein paar MB hat. Ist ja primär mal nur für mich und Bekannte. 😉

Danke schonmal für eure Hilfe!

Gruß

Shinzo

1.552 Beiträge seit 2010
vor 13 Jahren

Hallo Shinzo,

ich würde zu einer SQLCE tendieren. Dazu kannst du dir noch mit dem ADO.Net Entity Framework den DB-Zugriff generieren lassen und dann komott mit LINQ darauf zugreifen. Dasselbe gilt für LINQ to XML, wobei ich dies fast noch nie verwendet habe und desshalb in dieser Situation zum SQLCE tendiere. Jedoch kannst du auch ohne Benutzung des ADO.Net arbeiten und direkte SQL-Befehle an die SQLCE abfragen falls dir das lieber ist. Bei XML bleibt dir "nur" LINQ.

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

S
Shinzo Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

Habe mal eine SQLCE erstellt, sieht "relativ" einfach zu handhaben aus.

Von ADO.net und LINQ hab ich noch nie was gehört. Da werde ich mich mal reinlesen!

Aktuell hab ich dann mal ein DataGridView erstellt, das auf die Datenbank zugreift bzw. diese darstellt.

Werde mal ein bischen damit rumexperimentieren.

Danke für den Tipp!

Gruß

Shinzo

458 Beiträge seit 2007
vor 13 Jahren

Um es gleich vorweg zu sagen:

SQLDataSources sind der Teufel.

be the hammer, not the nail!

S
Shinzo Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

@aequitas: Kannst du mir auch genauer erläutern wieso?

Noch eine Frage zu den DataTables. Ich habe 3 DataTables, da es wie beim Karteikartensystem auch 3 verschiedene "Fächer" gibt. Allerdings haben die alle die selben Spalten, also sagen wir das deutsche Wort, das englische Wort, wie oft wurde es abgefragt, etc.

Falls ich nun eine Spalte hinzufügen oder entfernen möchte, wäre eine Art Vorlage nicht schlecht, anhand der die sich alle orientieren. Dann muss ich das nicht bei allen einzeln immer ändern. Gibts sowas?

1.552 Beiträge seit 2010
vor 13 Jahren

Hallo aequitas,

kann dir nicht folgen. Wo gibt es dort Probleme?

Edit: Ein Problem das mich gestört hatte war das hinzufügen oder löschen von Spalten in einer Tabelle. Dabei musste die komplette Tabelle mit Realtions gelöscht und neu aufgebaut werden.
Es empfiehlt sich dabei die Datenbank gut zu durchdenken und dann komplett aufzubauen, damit im nachhinein keine Änderungen mehr gemacht werden müssen.

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

S
Shinzo Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

Bei Relationen sehe ich gar nicht so das Problem, da ich da keine habe. Sind ja im Endeffekt nur 3 DataTables, bei denen ich wenn ein Wort gewusst oder nicht gewusst wurde, es in dem einen Table lösche und dem anderen hinzufüge.

Nur mit den Spalten hast du recht, da muss ich mir nun gute Gedanken machen, was alles rein soll. Denn das nachträglich alles nachzuziehen wird sicher kein Spaß.

Ich hatte zwar vor 2 Semestern eine Datenbank Vorlesung, aber bin mir nicht mehr sicher bei den Keys: Wenn ich das deutsche und das englische Wort zum Key mach und dann auch noch zum Primary Key, dann verhindert das ja, dass 2 mal das gleiche Wort eingegeben werden kann, oder? Also auch in beide Richtungen. Es soll weder auf der deutschen, noch auf der englischen Seite ein Wort doppelt vorhanden sein können. Sonst weiß man bei der Abfrage nachher ja nie, welche Übersetzung nun verlangt ist. 😉

Gruß

Shinzo

458 Beiträge seit 2007
vor 13 Jahren

SQLDataSources erscheinen ein geeignetes Bordmittel zu sein, um Daten an eine GridView zu binden.
Wenn du die Daten, die du anzeigen moechtest allerdings in einer n-Tier Anwendung in der Businesslogic manipulieren musst, wirds spaßig.
Mir ist nicht bekannt, wie ich eine saubere Schichtentrennung mit SQLDataSources hinbekomme, wenn hier jemand Erfahrungen hat moege er sie hier niederschreiben.
Meine Erfahrung ist, dass es (so gut wie) immer besser ist, sich ein Businessobjekt zu bauen, welches man dann an sein GUI-Element bindet.

be the hammer, not the nail!

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo Shinzo,

ich finde, dass für solche Zwecke eine XML-Datei genügend ist. Im Grunde spricht nichts dagegeben. Empfehlen würde ich dir, Umlaute ensprechend zu codieren, so dass es nicht zu Fehlern kommt. Zur Sicherheit kann man die XML-Datei mithilfe eines Schemas validieren. Mit LINQ to XML kannst du dann ganz praktisch auf die XML-Datei zugreifen und diese lesen und modifizieren.

zero_x

S
Shinzo Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

@zero_x: Wie erstelle ich die XML Datei dann so, dass es VS als Data Source anerkennt?

Ist da WPF dann vielleicht doch am Ende einfacher, wenn ich sowieso schon mit XML arbeite?

Gruß

Shinzo

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

so, dass es VS als Data Source anerkennt?

Als DataSource würde ich (immer) eigene Klassen verwenden und das Ganze unabhängig von der UI-Technologie halten. Ob nun WPF oder WinForms sollte egal sein.

Die eigenen Klassen können per XML-Serialisierung in XML geschrieben/gelesen werden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

458 Beiträge seit 2007
vor 13 Jahren

Als DataSource würde ich (immer) eigene Klassen verwenden und das Ganze unabhängig von der UI-Technologie halten. Ob nun WPF oder WinForms sollte egal sein.

Meine Rede.

be the hammer, not the nail!

S
Shinzo Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

Habe mich nun für XML entschieden, allerdings habe ich da noch ein kleines Problem.

Vom Typ Vokabel kann es natürlich beliebig viele geben, so habe ich das in der xsd-Datei auch deklariert. Wenn ich nun mit der xsd.exe daraus eine .cs Datei machen lasse, dann klappt das wie immer auch gut, nur macht er aus den Vokabeln einfach nur einen Array.

Aber einem Array kann ich nachträglich ja nicht so einfach weitere Objekte hinzufügen. Daher wäre meine Lösung jetzt, den Array in eine extra Liste zu kopieren und vor dem Speichern in die Datei wieder den Inhalt der Liste in den Array der Klasse Vokabeln (Vokabel ist Unterklasse von Vokabeln) zu kopieren.

Sieht da jemand eine andere Möglichkeit? Wie ich eventuell der xsd.exe sagen kann, dass sie nicht einen Array, sondern direkt eine Liste erstellen soll?

Gruß

Shinzo

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

ersetzt einfach den Array durch die List<T>.
Der Weg über xsd.exe ist nicht unbedingt notwendig - es kann auch ohne (de)serialisiert werden.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

S
Shinzo Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

Wenn ich den Array VokabelnVokabel (die xsd.exe nennt die Klassen immer OberklasseUnterklasse...) in eine List<VokabelnVokabel> umwandle, dann funktioniert ja dieser Zugriff hier nicht mehr:

oVokabeln.Vokabel_.Deutsch

Wie muss ich es dann anstellen? Wenn ich

oVokabeln.Vokabel.ElementAt(i).Deutsch

schreibe, dann bekomm ich die Fehlermeldung, dass List<VokabelnVokabel> keine Definition für ElementAt() hätte.

Wie lös ich das Problem?

Danke!

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

auf eine List<T> kann genauso indiziert wie auf einen T[] zugegriffen werden.
ElementAt ist in System.Linq.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

S
Shinzo Themenstarter:in
38 Beiträge seit 2010
vor 13 Jahren

System.Linq ist eingebunden, aber ich kann weder über oVokabeln.Vokabel_.Deutsch noch über oVokabeln.Vokabel.ElementAt(i).Deutsch drauf zugreifen.

Muss ich da in meiner Klasse, also in Vokabeln oder VokabelnVokabel noch das IEnumerable Interface implementieren? Hab ich noch nie gemacht...

Danke.

Gruß

Shinzo

€: Ok sein ganzes Problem war, dass i ein uint war und kein int. Hätte er mir ja auch direkt sagen können, anstatt immer mit dem IEnumerable zu kommen. xD

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

warum erstellst die Klassen nicht selbst? Dann hast du die Kontrolle.
Das Ganze ist so ähnlich wie in Klassen Architektur für Datenbankzugriff dargestellt.

Keiner weiß wei deine Klassen aussehen - zeig mal etwas Code (aber nur die relevanten Teile).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"