Anfängerfrage: Verweis auf Text-Elemente, oder doch Datenbank?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von siycah.

    Anfängerfrage: Verweis auf Text-Elemente, oder doch Datenbank?

    Hallo allerseits

    Bevor ich mein eigentliches Problem darstelle, eine kurze Vorgeschichte zu meinem "Fachwissen", was programmieren angeht. Im Studium hatten wir in einem Nebenfach ein bisschen VBA gelernt. Über das, was wir da gelernt haben, habe ich mich noch etwas intensiver damit beschäftigt und ein kleines Programm geschrieben, das dann aber wieder eingeschlafen ist. Jetzt, 13 Jahre später, will ich das wieder reaktivieren. Aber da das Programm auf Basis von Excel lief und das nicht jeder hat, wollte ich es in VB umwandeln und als eigenständiges Programm laufen lassen. Dazu habe ich ein bisschen gegoogelt und mir nicht nur Visual Studio, sondern auch die nötigen Code-Schnipsel so weit zusammengesucht, dass das auch zu meiner Zufriedenheit funktioniert.
    Wie ihr seht bin ich also absolut kein profesioneller oder gelernter Programmierer. Ich hoffe, dass mir hier trotzdem geholfen werden kann. :)

    Jetzt zum eigentlichen Problem. Das Programm soll für meine Freiwillige Feuerwehr sein, um virtuell Fahrzeug- und Gerätekunde üben zu können. Ich habe dazu Forms mit Bildern, die die Einsatzfahrzeuge und deren Geräteräuem zeigen. Man kann die Geräte anklicken und dann soll in einem weiteren Form ein Info-Text zu der jeweiligen Ausrüstung erscheinen. Das Programm kann noch etwas mehr, aber das ist für die Fragestellung gerade nicht relevant.
    Ich könnte jetzt den kompletten Info-Text zu jedem Ausrüstungsteil in den Quellcode schreiben, was bei einzelnen Worten ja kein Problem ist. Aber da die Texte je nach Ausrüstung auch mal etwas länger sein können, sieht das im Code echt blöd aus und ich denke, dass das auch nicht im Sinne des Erfinders ist. Außerdem wird das extrem unübersichtlich, wenn ich im Nachhinein doch nochmal was ändern möchte. Bei dem einen Fahrzeug, das ich bisher fertig integriert habe, sind das 86 Ausrüstungsteile. Und das ist nur eins von den Mittelgroßen.

    Im Moment sieht das so aus:

    Quellcode

    1. Sub Sub_LernDruckschlauch()
    2. Lbl_Info_Head.Text = "Druckschlauch"
    3. Lbl_Info_Text.Text = "Ein Druckschlauch dient zur Weiterleitung von Wasser. Es gibt sie in verschiedenen Längen und Durchmessern. Übliche Durchmesser sind:" & vbCrLf & "- A: 110 mm" & vbCrLf & "- B: 75 mm" & vbCrLf & "- C: 42 mm bzw. 52 mm" & vbCrLf & "- D: 25 mm" & vbCrLf & "Als " & Chr(34) & "Füllschlauch" & Chr(34) & " bezeichnet man einen kurzen Schlauch, der ausschließlich zum Befüllen von Wasserbehältern oder dem Fahrzeugtank genutzt wird. Sie unterliegen keiner regelmäßigen Druckprüfung und dürfen daher nicht unter Druck eingesetzt werden."
    4. Pic_Info.Image = My.Resources.Druckschlauch
    5. Me.Show()
    6. End Sub


    Meine Idee war daher, diese ganzen Texte in eine externe Datei auszulagern. Problem ist, dass dann nicht die komplette Datei eingelsen werden soll, sondern nur der Abschnitt, der sich auf den gerade angeklickten AUsrüstungsteil bezieht. Wäre xml da eine Lösung? Das kenne ich zumindest so bei einem Computerspiel, in dem ich mal im Modding aktiv war. Nur wie ich die Datei dann aufbaue und mit meinem Programm verknüpfe muss ich dann rausfinden.
    Auf der anderen Seite wurde mir auch die Verwendung einer Datenbank empfohlen. Dazu habe ich dann mal ein wenig gegoogelt, aber die Suchergebnisse haben dann meine Fachkenntnis doch übersteigen. Und bevor ich jetzt endlos lange in Fachartikeln versumpfe, die an meinem Problem komplett vorbei gehen und ich dann nur frustiert werde, hatte ich die Hoffnung, dass hier, wo ich auch vorher schon auf einige meiner Fragen Antworten gefunden habe, eine Hilfestellung bekomme, in welche Richtung ich gehen soll.

    Schonmal im Voraus Danke. Und die obligatorische Entschuldigung, wenn ich hier im falschen Unterforum gelandet bin. Aber ich habe meine Frage als nicht spezifisch genug gesehen, um ins Datenbank-Unterforum zu posten.
    Moin Walter und willkommen im Forum!

    Was du machen könntest, ist ein Ordner anlegen, wo mehrere JSON-Dateien liegen.
    Jede JSON-Datei weist du einfach ein Bereich zu.

    Z.B.:

    Quellcode

    1. {
    2. "motor": [
    3. "teil_name": "AGR-Ventil",
    4. "info_text": "Das AGR-Ventil leitet Abgase aus dem Abgasstrang zurück in den Brennraum unter bestimmten Voraussetzungen, um die Verbrennungstemperatur zu reduzieren",
    5. "bild": "<Pfad oder Base64>"
    6. ]
    7. }


    Das kannst du dann für alle weiteren Bereiche im Fahrzeug machen.

    Hier findest du die Dokumentation zum JSON-Format: json.org/json-en.html

    Von XML würde ich abraten. Es ist nicht wirklich menschenlesbar (da werden einige anderer Meinung sein, der grundsätzliche Konsens ist jedoch so) und wird mittlerweile seltener verwendet.

    Um JSON-Dateien einzulesen kannst du newtonsoft.json oder die im Framework eingebettete Version nutzen.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)

    siycah schrieb:

    Von XML würde ich abraten.


    Würde ich nur bedingt. Wenn man sich beim NetFX das Dataset anschaut, warum nicht einfach ein typisiertes Dataset, dazu dann DataSetInstance.LoadXml und WriteXml. Schon hat man ein Programm das Daten speichert und auch wieder laden kann mit Hausmitteln aus dem FW, auf einfachster Art und Weise ratz fatz fertig.

    Sobald aber irgendeineart von übertragung ansteht, würde auch ich eher zu JSON greifen, denn bei XML da sind nunmal mehr Daten da.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Vielen Dank für die Antworten
    Ich habe jetzt mal versucht mich etwas mit dem Thema json auseinander zu setzen, aber das scheint wohl meine bescheidenen Kenntnisse zu sprengen. Die ganzen Tutorials und Videos, die ich gefunden habe, gehen entweder so tief, dass ich nichts mehr verstehe ?( oder sie gehen irgendwie komplett an der Frage vorbei.

    Die json Datei zu erstellen ist ja kein Hexenwerk, vor allem mit so wenigen Infomrationen innerhalb eines Elements, wie es bei mir der Fall ist.
    Hier mal ein Beispiel mit nur Zwei Ausrüstungsteilen:

    Quellcode

    1. [
    2. {
    3. "name": "Standrohr",
    4. "info": "Das Standrohr dient der Wasserentnahme aus Unterflurhydranten. Hierzu wird es in den Hydrant geschraubt. Wichtig: Standrohr spülen, bis klares Wasser austritt, bevor man die Leitung zur Pumpe öffnet. Aufgrund der besonderen Bauvorm der Württembergischen Schachthydranten sind Standrohre hier deutlich länger, als in anderen Regionen Deutschlands."
    5. },
    6. {
    7. "name": "Schaumrohr",
    8. "info": "Das Schaumrohr vermischt das Wasser-Schaummittel-Gemisch mit Luft und erzeugt im Rohr den Löschschaum. Folgende tragbare Schaumrohre werden unterschieden:" & vbCrLf & "- das Schwerschaumrohr (S2, S4, S8) erzeugt einen dicken Schaum mit hoher Wurfweite" & vbCrLf & "- das Mittelschaumrohr (M2, M4, M8) erzeugt einen luftigen Schaum mit geringer Reichweite, der relativ leicht weggeweht wird, aber eine gute Löschwirkung hat" & vbCrLf & "- das Kombi-Schaumrohr (S/M) kann sowohl Schwer- als auch Mittelschaum erzeugen" & vbCrLf & "Die Zahl zeigt, mit 100 multipliziert, die Durchflussmenge des Rohes an." & vbCrLf & "Zum Erzeugen von Leichtschaum sind spezielle Leichtschaumgeneratoren erforderlich."
    9. }
    10. ]

    Aber bei meinem ganzen gegoogle habe ich weder rausgefunden, wie ich diese json-Datei jetzt korrekt in mein Programm Integriere, noch wie ich jetzt an der Stelle

    Quellcode

    1. Lbl_Info_Text.Text =

    Auf genau die Info-Stelle für das richtige Ausrüstungsteil aus der json verwiesen kann.

    Ich denke ich werde die Info-Texte einfach direkt im Quelltext stehen lassen. Funktioniert ja auch und ist von der Ressourcenbelastung sicher auch nicht schlimmer, als das in eine externe Datei zu laden.
    Jo, mir sieht das auch sehr nach einer Anwendung fürs typisierte Dataset aus. Daten laden, speichern, verarbeiten - einfachste Variante
    Oder gugge hier: DatasetOnly: DB-Programmierung ohne Datenbank
    Ein typDataset ist eine Mini-Datenbank, die man aber einfach laden und speichern (und sogar übertragen!) kann wie eine TextDatei.

    DTF schrieb:

    Sobald aber irgendeineart von übertragung ansteht...
    Ich sehe auch da keine Probleme. Zumindest von Wcf her kenne ichs so, dass man eh komprimierte Übertragung einstellt, und damit ist der Daten-Mengen-Unterschied weggezippt.
    Eben weil xml ein sehr redundant-haltiges Laber-Format ist, ergibt sich direktproportional dazu auch eine höhere Kompressionsrate.
    @Walter Deine JSON-Strings kannst du nicht mit VB-spezifischen Sachen zusammenfügen.

    Walter schrieb:

    " & vbCrLf & "


    Das kannst du ganz einfach mit den üblichen Escape-Chars ersetzen: "Zeile 1\nZeile 2"

    Um JSON in dein Paket einzubauen: install-package newtonsoft.json in deiner Paketverwaltungskonsole ausführen. Oder unter NuGet-Paketen nach "Newtonsoft.Json" schauen.

    Der Rest ist dann ziemlich simpel.
    Erstelle in deinem Programm eine Klasse, die so aufgebaut ist, wie dein JSON:

    C#-Quellcode

    1. class TruckInfo {
    2. [JsonProperty("name")]
    3. public string Name { get; set; }
    4. [JsonProperty("info")]
    5. public string Explanation { get; set; }
    6. }
    7. void Foo() {
    8. TruckInfo[] truckInfo = JsonConvert.DeserializeObject(File.ReadAllText("/path/to/file.json"));
    9. // do stuff
    10. }


    VB.NET-Quellcode

    1. Class SurroundingClass
    2. Class TruckInfo
    3. <JsonProperty("name")>
    4. Public Property Name As String
    5. <JsonProperty("info")>
    6. Public Property Explanation As String
    7. End Class
    8. Private Sub Foo()
    9. Dim truckInfo As TruckInfo() = JsonConvert.DeserializeObject(File.ReadAllText("/path/to/file.json"))
    10. End Sub
    11. End Class


    Irgendwie so in der Art wirst du was bauen müssen :)
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Freut mich, dass ich dir helfen konnte!
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)