Richtige Deklaration von Dataset und Tabellen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Philipp.

    Richtige Deklaration von Dataset und Tabellen

    Guten Abend,

    ich habe die Tage schonmal zu einem anderen Thema geschrieben, bin noch Neuling was die ganze Sache betrifft. Ich habe viel (grade zu den Basics) gelesen und scheitere nun doch an einer wahrscheinlich total einfachen Sache...

    Folgende Ausgangslage. Ich habe ein Dataset welches mehrere Tabellen enthält. Alle Tabellen habe eine Spalte die gleich benannt ist ("Col"). Ich möchte eine Tabelle mit einer For... each schleife durchlaufen lassen

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Projekt
    3. sub durchlauf
    4. Dim ds As New DataSetName
    5. Dim _DataFile As New FileInfo("Datei.xml")
    6. ds.ReadXml(_DataFile.FullName)
    7. For Each row In ds.Tabelle1
    8. MsgBox(row.col) 'Die msgbox ist bloß ein Beispiel.
    9. Next
    10. End Sub
    11. End Class


    Das mag jetzt noch nicht die perfekteste Lösung dafür sein, aber zumindest funktioniert es für mich zufriedenstellend.

    An Stelle der msgbox passiert noch ein bisschen mehr, der teil funktioniert aber für mich auch zufriedenstellend.

    Nun will ich mit dem gleichen Code nicht nur Tabelle1 sondern auch Tabelle2 Tabelle3,... durchlaufen.

    Was ich jetzt noch brauche, ist das ich den Teil in Zeile 11 des codes "ds.Tabelle1" als "variabel" hinterlegen kann die ich vorher abfragen kann (z.B. über einen select case o.ä.) Wäre super wenn mir da fix jemand auf die Sprünge helfen könnte auch wenn es wahrscheinlich eine zimliche Anfängerfrage ist...

    Vielen Dank.

    Grüße Philipp

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Sowas evtl in der Richtung. Achtung pseudo Code.

    VB.NET-Quellcode

    1. For each tbl as DataTable in DataSet.Tables
    2. For each row as DataRow in tbl.rows
    3. Debug.Print(row(“col“).toString())
    4. next
    5. next


    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Nun, Du könntest das z.B. in eine Function auslagern und als Parameter ne DataTable übergeben, also z.B.

    VB.NET-Quellcode

    1. Private Sub Scan(CurrentTable As DataTable)
    2. For Each Row In CurrentTable
    3. 'whatever
    4. Next
    5. End Sub


    Aber: Was soll das werden, wenn's fertig ist? Warum sollten viele Tabellen die gleichen Columns haben? Nenn mal bitte ein Beispiel, damit wir ggf. passende(re) Lösungen aufzeigen können. Da Du mit diesem String-Gesuche untypisiert arbeitest, kann es ganz schnell mal murks werden.
    Ich selbst habe sowas noch nie gebraucht, da außer der Spalte ID bei mir selten eine Column mit gelichem Namen in mehreren Tables vorkommt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    VaporiZed, da hast du genau die richtige Frage gestellt. Denn als ich sie dir beantworten wollte ist mir aufgefallen, was ich besser machen kann und muss.

    Ich kratze es nur kurz an, ich habe eine Menge Fragen in den Tabellen gespeichert von denen der Nutzer einen Ausschnitt (einen Tabellenblock) gestellt bekommt. Bisher habe ich intuitiv die Antworten zu den Fragen zugeordnet in eine extra spalte ("Antwort"), die hatten dadurch alle Tabellen gleich. Aber das kann man ja viel galanter lösen indem die Antworten eine eigene Tabelle bekommen und damit brauche ich dann auch kein hin und her gewechsel veranstalten...

    Ist natürlich auch nicht der Sinn, dass es doppelte Spalten gibt... Für mich sollte das Thema damit erledigt sein.
    Ich glaub ich versteh das Datenmodell noch nicht ganz. Du hast Fragen und passende Antworten. Wozu braucht es da mehrere Tabellen? Da reicht doch eine. Die hat dann die Spalten ID, Frage, Antwort. Und dann eben x Zeilen, wobei jede Zeile eine Frage und die dazugehörige Antwort enthält. Aber es scheint wohl komplizierter zu sein, oder?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Im grunde genommen ist es nicht viel komplexer: Man muss nur schauen welche Fragen gestellt werden müssen und schon kann man alles in eine Tabelle packen. Das könnte man sicherlich über eine zusätzliche Spalte lösen in der die Zuordnung zu einem Fragenszenario vermerkt ist. Ich bekomme die Daten allerdings pro Szenario als Block (eine Tabelle mit Fragen für Szenario 1, eine Tabelle mit Fragen für Szenario2,... ) Und wollte dieses Schema gerne beibehalten (ob das so sinnvoll war stelle ich momentan in Frage).

    Philipp schrieb:

    Was ich jetzt noch brauche, ist das ich den Teil in Zeile 11 des codes "ds.Tabelle1" als "variabel" hinterlegen kann
    Das ist zunächstmal so nicht vorgesehen.
    Für das Programm sind Tabelle1 und Tabelle2 unterschiedliche Klassen - ganz egal, ob eine deren Spalte denselben Namen trägt.

    Sauber programmiert ist also, wenn du deine Schleife tatsächlich für jede Tabelle ausformulierst, für die du es brauchst.

    Man kann auch mit untypisierten "Hacks" ankommen, aber das würde ich einem Anfänger nicht unbedingt empfehlen.
    Wichtiger finde ich die Lern-Erkenntnis, dass die Tabellen und Rows in einem typDataset verschiedene Klassen sind, die sich nicht über einen Kamm scheren lassen.
    meine dringende Empfehlung: Lass die Datenbank weg - wenn das möglich ist.
    Das ist möglich, solange du keine Mehrbenutzer-Anwendung in einem Netzwerk programmierst, oder solange weniger als mw. 20000 Datensätze vorhanden sind.

    Grad Umbauarbeiten am Datenmodell - wie jetzt von dir anvisiert - können viel einfacher direkt im typDataset vorgenommen werden - da muss man nicht jedesmal mit dem Datenbank-Management herumhampeln.

    Was ich auch empfehle:
    Erklär mal, was deine Anwendung soll, und zeige Screenshot von deim Dataset (damit zeigst du das Datenmodell, was du zu diesem Zwecke konzipiert hast).
    Dann kann man dich sofort auf Datenmodell-Design-Fehler hinweisen, was dir u.U. Monate sinnloser Arbeit ersparen kann.
    Weil das Datenmodell ist die Grundlage einer Datenverarbeitung, und wenn das fehlerhaft ist, kann am Ende nix brauchbares rauskommen.
    Ich habe mich falsch ausgedrückt: Es gibt keine Datenbank. Es gibt nur ein Dataset und ein xml dokument welches den Inhalt des Datasets zu beginn bereitstellt. Dementsprechend musste ich auch nur das Dataset etwas umstricken und keine Datenbank. Ich habe das Dataset fälschlicherweise als Datenbank bezeichnet.

    ErfinderDesRades schrieb:

    Was ich auch empfehle:
    Erklär mal, was deine Anwendung soll, und zeige Screenshot von deim Dataset (damit zeigst du das Datenmodell, was du zu diesem Zwecke konzipiert hast).
    Dann kann man dich sofort auf Datenmodell-Design-Fehler hinweisen, was dir u.U. Monate sinnloser Arbeit ersparen kann.
    Weil das Datenmodell ist die Grundlage einer Datenverarbeitung, und wenn das fehlerhaft ist, kann am Ende nix brauchbares rauskommen.


    Okay ich erkläre es mal, da ich momentan echt nicht weiter komme.

    Kurz zur Anwendung: Es gibt 10 Fragenblöcke, die dem Nutzer gestellt werden (jeweils ca. 30 - 40 Fragen). Allerdings muss ein Nutzer nicht alle Fragen beantworten sondern nur die Fragen aus zwei Blöcken. Zu jeder Frage gehören auch noch zusätzliche Spalten (z.B. für drei Überschriftenebenen (die benötige ich zur Strukturierung und zum Export) und eine Spalte mit einer Beispielantwort). In die Spalte Antwort wird dann die jeweils zugehörige Antwort gespeichert.

    Daher habe ich das ganze bis jetzt so aufgebaut: Ein Dataset mit 10 DataTables die gleich aufgebaut sind (Bild Unbenannt1.PNG, es ist nur 1 von 10 Datatables abgebildet) Ich kann einfach eine Tabelle nehmen und diese nach Zeilen der Reihe nach durchlaufen lassen (ich will nicht, dass der Nutzer in der Tabelle rumwurstelt, sondern in einer schönen Eingabemaske die Frage und das Antwortkästchen präsentiert bekommt, mit einem Weiter und Zurück Button.

    Was soll ich sagen? Es funktioniert. So wie ich mir das vorstelle und ich kann es auch so auswerten wie ich das will. Okay ich gebe zu, es funktioniert nicht sonderlich galant, stellenweise arbeite ich mit untypisierten Daten. Also Mist...

    Besser müsste es ja sein, dass man nur noch eine Tabelle mit den ganzen Fragen hat, erweitert um die Spalte "Fragenblock Nummer" (oder wie auch immer) in der dann die Zuordnung zum Fragenblock erfolgt. Außerdem eine Tabelle mit Antworten, in der die Nutzerantworten gespeichert werden. Dort könnte man nun auch noch die zusätzliche Spalte "Name" einfügen mit der man Antworten verschiedener Benutzer speichern und auseinanderhalten könnte.
    Das könnte dann in etwa so aussehen wie im Bild Unbenannt2.PNG .

    Was soll ich sagen: Mit dieser Struktur bekomme ich überhaupt nichts hin. Wie halte ich dann tatsächlich die Kategorien auseinander, dass ich alle Fragen einer (bzw. von zwei) Kategorien stellen kann und nicht von allen? Sobald es ins typisierte Dataset geht habe ich ständig Probleme und komme nicht weiter, habe nicht die richtigen Formulierungen und so weiter.
    Mt dem Suchen in vielen Foren stoße ich nun an meine Grenzen, ich habe auch die YT Viedeos geschaut (auch diese 4 Views Videos und noch weitere). Ich habe auch schon verschiedene Lehrbücher durchgeschaut. Dort wird in der Regel beim Thema DataSet allerdings nur so die einfachen Sachen abgehandelt: DataGridView und ein bisschen in der Tabelle rumbasteln, aber kaum auswählen von Datensätzen per code usw. Damit macht es einfach nicht klick.

    Ich würde mich wirklich freuen wenn mir jemand einen Anstoß geben kann, damit es endlich klick macht. :o
    Bilder
    • Unbenannt1.PNG

      7,83 kB, 185×267, 168 mal angesehen
    • Unbenannt2.PNG

      12,35 kB, 577×313, 158 mal angesehen

    Philipp schrieb:

    Besser müsste es ja sein, dass man nur noch eine Tabelle mit den ganzen Fragen hat, erweitert um die Spalte "Fragenblock Nummer" (oder wie auch immer) in der dann die Zuordnung zum Fragenblock erfolgt.
    ja, genau.
    Du musst eben ein korrektes relationales Datenmodell entwerfen - das mit 10 gleichen Tabellen ist NoGo.
    Um ein relationales Datenmodell zu entwerfen muss man das halt lernen. vlt. hilft dir dieses Tut: codeproject.com/Articles/10309…l-Datamodel-for-Beginners

    Du musst halt die bei dir auftretenden Entitäten identifizieren, als Tabellen anlegen, und die notwendigen Relationen in richtiger Weise setzen.

    Mit den Entitäten Frage und Antwort ist dir das ja schon gelungen.
    Wenn du Kategorien hast, so ist Kategorie selbstredend auch eine Entität und will ins Dataset.

    Du kannst deine Dataset-Versuche auch zippen und anhängen - die xsd-Datei beinhaltet das dafür wesentliche.

    ErfinderDesRades schrieb:

    Du musst eben ein korrektes relationales Datenmodell entwerfen - das mit 10 gleichen Tabellen ist NoGo.


    Ja, das habe ich mittlerweile ja herausgefunden :) Deshalb will ich es ja besser machen. Das von dir verlinkte tutorial und besonders auch der zweite Teil haben wir durchaus weitergeholfen.

    Okay dann füge ich die Kategorie als eigene DataTable ein und schaue mal wie ich weiter komme. Vielen Dank soweit schonmal.

    EDIT: Ich fasse es nicht, ich mache riesen Fortschritte :D Ich habe die drei aufeinander aufbauenden Tabellen Kategorie - Frage - Antwort und kann diese perfekt anzeigen lassen, das Tutorial hat mir sehr weiter geholfen.
    Aber kann ich der bindingsource (z.B. über einen Button) "Wähle Kategorie xy aus"? sprich sowas wie

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. KategorieBindingsource.derEintragMitDemWert("Kategorie1")
    3. End Sub


    Edit: Okay ich bekomme es mit dem KategorieBindingSource.Filter = "Kategorie = 'xy'" hin. Aber das ist wahrscheinlich wiedermal nicht sonderlich elegant... ;)

    Edit: Und folgender Punkt wäre noch offen: Wie kann ich jetzt in einer neuen Klasse die nur Code enthält (kein Form usw.) zum Beispiel auf alle Datensätze der Kategorie1 zugreifen oder ähnlich. Wie fügt man die Bindingsource zu einer neuen Klasse hinzu? (Bei formularen kann man sie ja einfach ins formular ziehen und fertig.)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Philipp“ ()

    Bindingsources sind Gui-Elemente, sind auffm Form, und sollen dort auch bleiben.
    Einer anneren Klasse sollte man keine BindingSource zufügen - warum, denkst du, sollte das wünschenswert sein?



    übrigens, wenn mein Tut dir was gebracht hat, rate es doch up. Ich find meine CP-Artikel chronisch under-rated, im Vergleich zu manch annerem Schrott, der dort Top-Ratings einfährt.

    ErfinderDesRades schrieb:

    und sollen dort auch bleiben.
    Einer anneren Klasse sollte man keine BindingSource zufügen - warum, denkst du, sollte das wünschenswert sein?


    Ich bin in einer neuen Klasse und möchte auf den Inhalt des datasets zugreifen und zwar möchte ich jede Antwort die in einer Kategorie gespeichert wurde ausgeben (z.B. in ein Textdokument schreiben). Das heisst ich muss ja das dataset filtern können (nur antworten aus Kategorie x) -> Das hätte ich mit einem bindingsource jetzt hinbekommen. und hätte dann eine for ... each schleife drüberlaufen lassen können (für jeden Eintrag kopiere diesen Eintrag und füge ihn im Textdokument ein). aber wenn ich nicht filtere, dann bekomme ich ja auch die kategorien angezeigt die ich nicht sehen will...

    ErfinderDesRades schrieb:


    übrigens, wenn mein Tut dir was gebracht hat, rate es doch up. Ich find meine CP-Artikel chronisch under-rated, im Vergleich zu manch annerem Schrott, der dort Top-Ratings einfährt.


    Das stimmt. Von einem Upvote hat mich bisher die notwendige Registrierung abgehalten, aber da kann ich zu kommen. ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Philipp“ ()

    Philipp schrieb:

    Das heisst ich muss ja das dataset filtern können
    Und da sind wir bei dem, was ich hier neulich auch hatte: Linq2DataSet - vorausgesetzt, dass es um schnelle, aber ggf. komplexe, gefilterte Anzeigen in nem DGV geht.
    Aber Du kannst auch mit normalem LINQ filtern, wenn es um codeseitige Weiterverarbeitung geht. Als Beispiel:

    VB.NET-Quellcode

    1. Dim WantedCategory = Tds.Kategorie.First(Function(x) x.Name = "Wirtschaft")
    2. Dim AllQuestionsOfOneCategory = Tds.Fragen.Where(Function(x) x.CategoryRow = WantedCategory)
    3. For Each Question In AllQuestionsOfOneCategory
    4. '...
    5. Next

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Ich stelle das erst nochmal zurück. Ich komme so weiter.

    Spoiler anzeigen
    Ich habe noch einige Zeit ausprobiert mein Problem zu lösen und dann brauchte ich nach einigem Frust erstmal Ruhe. Ich habe es hinbekommen ein Datagridview zu erzeugen in dem alle Fragen angezeigt werden die ich abfragen möchte. Das war soweit so einfach. Nur ich möchte dem Benutzer ein Eingabefenster mit Textboxen zur Verfügung stellen und nach jeder mit Klickmöglichkeit auf "weiter zur nächsten Frage" oder "Zurück zur letzten Frage" so nach dem Motto.

    Ich bekomme mein Problem nicht gelöst und mache daher nochmal einen Schritt zurück um nachzufragen ob Ihr mir nochmal helfen könnt. Unten habe ich nochmal die aktuelle Datenstruktur eingefügt.

    Ich glaube ich habe mich an einer Stelle im Projekt vollkommen verrant...

    Also nochmal "was ich will":

    - In der Tabelle Fragen befinden sich Fragen in ~10 Kategorien und ~ 40 Fragen pro Kategorie (unterschiedlich) mit dazugehörigen Daten wie z.B. Überschriften, Beschreibungen, Kontext,...
    - In der Tabelle Antworten ist erstmal nichts

    Es werden zwei Kategorien ausgewählt durch den Benutzer und die Auswahl wird abgespeichert.

    Die Fragen aus den ausgewählten Kategorien werden zusammengestellt und können dann durch den Benutzer (hintereinander oder auch in getrennten Blöcken, das ist mir einigermaßen Egal) beantwortet werden.

    Dazu habe ich ein Eingabeformular erstellt in welchem die Überschriften, der Kontext und so weiter angezeigt wird und unten ein Eingabefeld für die Antwort ist. Am Schluss dann noch zwei Buttons "speichern und weiter" und "Speichern und zurück" o.ä. für den nächsten Datensatz. < Das habe ich schon hinbekommen wenn ich zum Beispiel ALLE Fragen in einer Tabelle beantworten lassen will (Deshalb hatte ich ja zunächst einen Ansatz mit 10 Tabellen, für jede Kategorie eine eigene Tabelle im Dataset). Das funktionierte. Aber wie ich das ganze in professionell und mit dem Typisierten Dataset hinbekomme... kein Plan.

    Wie gesagt was ich hinbekommen habe: Es mit der aktuellen Datenstruktur die Fragen aus den gewählten Kategorien in einem DataGridView anzeigen zu lassen. Dort bekomme ich dann aber nicht die Verknüpfung mit der Tabelle Antworten hin und so weiter. Und ich kann auch mit diesen Daten nicht ausserhalb des DataGridViews arbeiten (also in Labels (für die Überschriften) und Textboxen(für Antwort und Kontext,...)). Auch bekomme ich keine BindingSource mit dem DataGridView zugewiesen (ist das gar nicht möglich?)

    Mit der Bindingsource konnte ich gut arbeiten als ich sie noch direkt mit dem Dataset verbunden habe und konnte dann immer über Movenext zum nächsten eintrag springen und die Textfelder aktualisierten sich automatisch.

    Bilder
    • Unbenannt.GIF

      53,46 kB, 892×332, 147 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Philipp“ ()