Datenbank oder was?

Liebe Experten,

ich wollte nur mal kurz fragen, welchen Weg ich eurer professionellen und geschätzten Meinung nach einschlagen soll.

Das ZIEL ist eine kleine, süße Anwendung zum Karteikartenlernen. (Es spielt keine Rolle, ob es so was schon gibt, ich will mir ein Programm schreiben, das genau auf meine Bedürfnisse zugeschnitten ist.) Ich will mit meinem Programm also Karteikartenstapel anlegen, Karteikarten beschriften und verwalten und mich dann abfragen lassen können.

Als zur Verfügung stehende MITTEL habe ich Visual Basic 2005 Express und einige Vorkenntnisse mit Visual Basic aus früheren Jahren. In Sachen Datenbankprogrammierung bin ich ganz und gar nicht fit, ich habe das aber schon mal halbwegs hinbekommen (früher - mit Visual Basic und Access-Datenbanken).

Das PROBLEM ist für mich Folgendes: Jeder Karteikartenstapel soll durch eine eigene Datei präsentiert werden. Der User soll also über das Programm beliebg viele neue Dateien anlegen können.

Die FRAGE ist, wie ich hier vorgehe:

MÖGLICHKEIT 1: Ich benutze VB-Befehle, um die Datensätze in Dateien zu schreiben. Hierbei wäre mir unklar, wie ich es ermöglichen könnte, auch Anführungszeichen und Kommata als Eingabe auf den Karteikarten zu ermöglichen, denn meiner Erinnung nach sehen die Dateien so aus:

„Eintrag 1a“, „Eintrag 1b“
„Eintrag 2a“, „Eintrag 2b“
usw.

MÖGLICHKEIT 2: Ich greife auf die Datenbankfunktionalität von .net zu. Das Problem hierbei ist, dass es mir schwerfällt, mich in diese Datenbanktechnik reinzufinden. Außerdem ist die Frage, ob sich das überhaupt lohnt. Die Datenbanken selbst wären ja sehr einfach: eine Datenbank mit nur einer Tabelle. Andererseits weiß ich noch nicht mal (mehr), wie man eine Datenbank aus der Anwendung heraus erstellt, wie also der Quellcode lautet, der eine Datenbank erzeugt.

Meine Frage ist, welchen Weg ihr mir empfehlen würdet, Möglichkeit 1 oder 2? Welcher wird jemanden wie mich, der kaum noch Ahnung davon hat, insbesondere was Datenbank angeht, schneller zum Ziel führen? Und wäre eine „richtige“ Datenbank per se ein Schießen mit Kanonen auf Spatzen?

Freue mich über Einschätzungen!

Levay

Hallo.

Das ZIEL ist eine kleine, süße Anwendung zum
Karteikartenlernen.
Als zur Verfügung stehende MITTEL habe ich Visual Basic 2005
Express und einige Vorkenntnisse mit Visual Basic aus früheren
Jahren.

Darf man auch ‚SharpDevelop‘ mit ins Boot nehmen ? Damit könnte man
den Anwendungsradius für ADO.NET und SQL Server MSDE sicher erweitern.

Die FRAGE ist, wie ich hier vorgehe:

MÖGLICHKEIT 1: Ich benutze VB-Befehle, um die Datensätze in
Dateien zu schreiben. Hierbei wäre mir unklar, wie ich es
ermöglichen könnte, auch Anführungszeichen und Kommata als
Eingabe auf den Karteikarten zu ermöglichen, denn meiner
Erinnung nach sehen die Dateien so aus:

„Eintrag 1a“, „Eintrag 1b“
„Eintrag 2a“, „Eintrag 2b“
usw.

Warum auch nicht (obwohl das mit ‚Perl‘ wohl etwas einfacher wäre, aber das gehört nicht hierher…). Irgendwo existiert also ein Eingabefeld, dessen Inhalt den zukünftigen Dateinamen darstellt.

MÖGLICHKEIT 2: Ich greife auf die Datenbankfunktionalität von
.net zu. Das Problem hierbei ist, dass es mir schwerfällt,
mich in diese Datenbanktechnik reinzufinden. Außerdem ist die
Frage, ob sich das überhaupt lohnt. Die Datenbanken selbst
wären ja sehr einfach: eine Datenbank mit nur einer Tabelle.
Andererseits weiß ich noch nicht mal (mehr), wie man eine
Datenbank aus der Anwendung heraus erstellt, wie also der
Quellcode lautet, der eine Datenbank erzeugt.

In der genannten Express Edition ist in der Hilfe ein Beispiel hierzu verfügbar. Innerhalb des Programms wäre das unter ( ms-help://MS.VSExpressCC.v80/MS.NETFramework.v20.en/dv_vbcnexpress/html/c9588be7-4e8d-4680-9813-234f81872a0a.htm ) zu finden. Die MSDN Hilfe ergibt folgendes: http://msdn2.microsoft.com/de-de/library/2f0kyy1z.aspx -> „FileSystem-Beispiel“
So gesehen sind beide Möglichkeiten gangbar, aber die erste (Datei auf Filesystem) wäre wohl die einfachere…

HTH
mfg M.L.

Hallo,

also eine Datenbank kannst du dafür sicher auch verwenden. Alledings würde ich dir da keine „große“ empfehlen, die als Service oder eigenständiges Programm arbeitet, sondern eine wie Embedded Firebird oder sqlite. Diese liegen als dll vor.
Die Frage ist nur, ob du dir den Aufwand(SQL, ADO.NET, Datenbankanbindung, etc.) antun willst.

Eine andere und sehr einfache Möglichkeit bietet dir .NET da schon an:
Serialisierung. Geht einfach und schnell
=>http://msdn.microsoft.com/library/deu/default.asp?ur…

Ich glaube nicht, dass ich wirklich verstanden habe, was das mit der Serialisierung zu bedeuten hat. Aber da du meinst, dass es für so einfache Zwecke übertrieben wäre, mit Datenbanken anzufangen, danke ich trotzdem für diesen Hinweis, den ich mir zu Herzen nehmen werde.

Levay

Hallo,

danke für den HInweis. Den Quellcode hatte ich schon gefunden, bei mir funktioniert das Programm aber nicht richtig, und ich steige auch nicht durch. Ich müsste mich wohl wirklich mehr mit Datenbanken beschäftigen, nd das lohnt sich für micheigentlich nicht.

Also werde ich mich mal mit dem verschiedenen Möglichkeiten beschäftigen, das auf „File-Basis“ zu verwirklichen.

Levay

Hi!

Wenn Du jede Karteikarte als eigene Datei implementieren willst, dann brauchst Du definitiv keine Datenbank - Du willst ja keine Beziehungen zwischen den Daten verwalten.

Für das konkrete Schreiben und Lesen von Daten in/aus Dateien solltest Du Dir unbedingt den Namespace System.IO ansehen und Dich mit dem Konzept von Streams vertraut machen.
Vom Verwenden von VB Befehlen zur Dateibearbeitung kann ich nur abraten. Ist zwar schon einige Zeit her, dass ich sowas mit VB machen musste, aber ich kann mich heute noch mit Grausen an den Code erinnern.
Nimm auf jeden Fall lieber die Klassen aus System.IO.

Wie an anderer Stelle vorgeschlagen, wäre dann das Thema Serialisierung noch interessant. Dabei geht es im wesentlichen darum, ganze Objekte/Objekthierarchien in eine Datei (genauer gesagt: In einen Stream) zu schreiben bzw. daraus zu lesen und somit wieder herzustellen.
In .NET wird das alle Nase lang gemacht.

Gruß,
Martin

Serialisierung wäre wohl der einfachste Weg.
Was genau verstehst du da nicht?

Ehrlich gesagt verstehe ich nur Bahnhof, also gar nix. Ich weiß aber jetzt ja, was ich mir anlesen muss. Und das ist doch schon mal ein Anfang :smile:

Levay

Wenn Du jede Karteikarte als eigene Datei implementieren
willst, dann brauchst Du definitiv keine Datenbank - Du willst
ja keine Beziehungen zwischen den Daten verwalten.

Das ist ja schon mal eine klare Aussage.

Für das konkrete Schreiben und Lesen von Daten in/aus Dateien
solltest Du Dir unbedingt den Namespace System.IO ansehen

Gut. Das werde ich tun.

und
Dich mit dem Konzept von Streams vertraut machen.

Ist das was Verwandtes zu Namespace System.IO?

Vom Verwenden von VB Befehlen zur Dateibearbeitung kann ich
nur abraten. Ist zwar schon einige Zeit her, dass ich sowas
mit VB machen musste, aber ich kann mich heute noch mit
Grausen an den Code erinnern.

Ja, ich weiß… Darum scheinen mir Alternativen auch sinnvoller zu sein.

Nimm auf jeden Fall lieber die Klassen aus System.IO.

Werde ich mir ansehen.

Wie an anderer Stelle vorgeschlagen, wäre dann das Thema
Serialisierung noch interessant. Dabei geht es im wesentlichen
darum, ganze Objekte/Objekthierarchien in eine Datei (genauer
gesagt: In einen Stream) zu schreiben bzw. daraus zu lesen und
somit wieder herzustellen.

Strem… *notier*

In .NET wird das alle Nase lang gemacht.

Das ist gut, denn .NET benutze ich ja :wink:

Danke.

Levay

Ein simples Beispiel in C#

[Serializeable\>
public class Word {
 public string englishWord, germanWord;
}

[Serializeable\>
public class WordStack: List {

 public bool Save(string fileName) {
 FileStream fs = null;

 try {
 fs = new FileStream(fileName, FileMode.Create);
 BinaryFormatter formatter = new BinaryFormatter();
 formatter.Serialize(fs, this);
 return true; 
 } catch {
 return false;
 } finally {
 if (fs != null) fs.Close();
 }
 }

 public static WordStack Load(string fileName) {
 FileStream fs = null;

 try {
 fs = new FileStream(fileName, FileMode.Open);
 BinaryFormatter formatter = new BinaryFormatter();
 return (WordStack)formatter.Deserialize(fs);
 } catch {
 return null;
 } finally {
 if (fs != null) fs.Close();
 }
 }
}

Mit Save speicherst du den ganzen Stapel sammt aller darin enthaltenen Word-Klassen in eine Datei.
Und mit Load kannst du ihn wieder laden.
Mehr ist es nicht.

Hallo!

Ich hätte noch eine dritte Möglichkeit. Du speicherst die Daten zwar in Dateien, aber in XML-Dateien. So musst du dich nicht ums Verwalten von den Datensätzen in den Dateien kümmern.
Zum Lesen und Schreiben von XML Dateien gibt es in der Klassenbibliothek die Klasse „System.Xml“.

mfg
chris

Hi!
Ganz geschickt wäre natürlich, einen XmlSerializer zu verwenden, um die Objekte zu serialisieren… :smile:

Gruß,
Martin

Hallo Chris,

ich habe mir das jetzt mal angesehen. Eine Frage: Sehe ich es richtig, dass ich dem Nutzer nicht erlauben könnte, Anführungszeichen zu benutzen?

Levay

Natürlich geht das.
Wenn Du Deine Objekte binär serialisierst, dann ist der Inhalt Deiner String-Attribute eh’ egal, aber selbst bei XML-Serialisierung werden die Zeichen, die in XML-Dateien eine Sonderbedeutung haben, entsprechend entwertet, so dass Du Dir um solche Details keine Gedanken machen musst.

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]