DataSet/DatenBank - Erstellen - Verwalten / Einträge anlegen, auslesen

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

Es gibt 58 Antworten in diesem Thema. Der letzte Beitrag () ist von asusdk.

    DataSet/DatenBank - Erstellen - Verwalten / Einträge anlegen, auslesen

    Hallo an alle,

    ich suche nach einer Möglichkeit, einen "Eintrag" zu erstellen der folgendes enthält :

    Name, Art, Sprache, laangen text(inhalt der textfiles).

    bisher mache ich das in dem für jeden Namen eine neue Textfile angelegt wird, die dann die restlichen Daten enthält, bei Programmstart werden alle (im Pfad) verfügbaren Files ausgelesen und deren Namen in einem Listview angezeigt,
    ich würde dies sehr gerne in eine Datenbank oder ein Dataset umwandeln, da es die Verwaltung deutlich effizienter gestallten würde, jedoch habe ich sowohl mit den Tutorials hier im Forum als auch mit denen von Youtube
    absolut nichts anfangen können, weder weiss ich wie ich manuell einen Eintrag hinzufügen oder löschen kann, noch weiss ich genau wie so eine Datenbank oder Dataset aufgebaut sein muss/sollte.

    wie gesagt hiesige Tutorials,Youtube und auch google helfen leider 0% weiter.

    Greets
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Dann hast Du wohl die falschen Tuts genutzt. ErfinderDesRades hat mit seinen view Views sehr gute Tuts (auch auf youtube) erzeugt, aus denen ich komplett gelernt habe und seitdem soviel wie möglich mit DataSets mache. Hast Du diese auch genutzt, wenn ja, wo kamst Du nicht weiter?
    Eine DataTable in nem DataSet kann problemlos die Daten aufnehmen, die Du hast und man kann die Daten dann auch in einer einzigen Datei speichern.
    btw, nur um alle Klarheiten zu beseitigen: Was meinst Du mit Sprache? Programmiersprache oder menschliche Sprache?

    Ganz kurz zusammengefassst:
    1. Neues Element dem Projekt hinzufügen, nämlich ein DataSet
    2. Im DataSetDesigner eine DataTable hinzufügen (entweder über Toolbox oder Rechtsklick auf die leere Designerfläche)
    3. gewünschte Anzahl von DataRows hinzufügen (Strg+L oder Rechtsklick auf die DataTable)
    4. Datentyp der Rows im Eigenschaftenfenster anpassen
    5. Entweder über den Designer Deines Hauptprogramms die Daten z.B. als DataGridView einfügen (dazu Ansicht -> weitere Fenster -> Datenquellen, DataTable wählen und per Drag&Drop auf Deine Form ziehen) oder das DataSet im Code einbauen
    6. Daten dem DataSet hinzufügen
    7. have fun
    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“ ()

    Sprache, soll eine Programmiersprache darstellen.

    Ich hab mir jetzt auch mal das erste der Videos angeschaut, und leider versteht man dabei nur eines : Bahnhof

    fällt mir leider öfter auf das bei Tutorials immer die kompliziertesten Beispiele verwendet werden, anstelle von einfach aufgebauten, so das man diese mal nachvollziehen könnte
    (Im video, dreiecksbziehung aus verschiedenen tabelen, extrem schwer zu lesender Codeabschnitt mit Schleifen und co, usw.)
    Wäre das ein (für mich) verständliches Tutorial, könnte ich damit arbeiten, so leider nicht
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hm...ok.
    Wie weit kannst Du meine 7-Punkte-Zusammenfassung nacharbeiten? Ab wo wird's nicht mehr für Dich nachvollziehbar (in Durchführung oder Sinnhaftigkeit)?
    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.
    denke bis inkl. punkt 4 danach kommt ja das was ich mir mit diesem thread erfragen möchte, wie generiere ich dann die Einträge, wie greife ich auf einträge zu, Ohne DataGridView

    links quasi eine listview, mit den Namen der Einträge, rechts eine Richtextbox mit dem Inhalt des Code eintrags,

    Art und Sprache dienen nur falls gewünscht als filter
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    DGV, ListView und Co sind immer nur zur Darstellung von Daten vorgesehen, nicht zur Manipulation. Ein DGV hat den Vorteil, dass von Haus aus eine Verbindung zu einer Datenquelle aufgebaut werden kann. Bei vielen anderen Controls ist das nicht so einfach.

    Bitte nicht vermuten, sondern nachprüfen, ob Du bis Punkt 4/5 kommst. Danach geht es folgendermaßen weiter.

    VB.NET-Quellcode

    1. Private DtsExample As New DataSet1
    2. Private Sub FillDataSetWithData()
    3. DtsExample.DataTable1.AddDataTable1Row("yourText")
    4. End Sub


    Dabei habe ich absichtlich DataSet, DataTable und DataRow bei den vorgeschlagenen Namen unverändert belassen. Die DataTable1 enthält nur eine DataRow mit dem Typ String. Diese wird wie o.g. erzeugt. Schon Hat Die Tabelle in Deinem DataSet einen Dateneintrag. Abhängig davon, wieviele und welche DatenRows Deine DataTable hat, ändert sich natürlich der Aufrug von DtsExample.DataTable1.AddDataTable1Row(), da die Parameter in den Klammern davon abhängig ist.

    EDIT: Später geht das mit Laden und Speichern natürlich anders, aber jetzt erstmal manuell mit Beispiel-Daten befüllen.
    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 1 mal editiert, zuletzt von „VaporiZed“ ()

    Mein Dataset :




    versuchter Code :
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private DtsExample As New DataSetSnippets
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. End Sub
    4. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    5. DtsExample.Snippet.AddSnippetRow("yourText")
    6. DtsExample.Snippet.AddSnippetRow(1)
    7. End Sub
    8. Private Sub ListView1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListView1.SelectedIndexChanged
    9. End Sub


    Fehler :




    ID ist int32 (daher die 2te versuchszeile oben)
    deer rest ist alles vom typ string
    Bilder
    • Table.JPG

      11,84 kB, 152×123, 2.263 mal angesehen
    • Fehler.jpg

      79,5 kB, 1.230×340, 1.928 mal angesehen
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Genau. Die AddSnippetRow hat nämlich von Haus aus 2 Aufrufmöglichkeiten. Einmal, indem Du eine fertige SnippetRow übergibst, was der Compiler versucht, wenn Du nur ein Argument übergibst. Oder Du gibst alle Argumente mit Komma getrennt an, nämlich: AddSnippetRow(Name, Art, Sprache, Code). ID brauchst Du nicht anzugeben, da es automatisch erstellt wird, da Du es auf AutoIncrement gestellt hast.
    Hättest Du nur eine DataRow, z.B. Name, dann könnte der Compiler mit Angabe des Arguments "yourText" klar unterscheiden. Nutzt er den Aufruf mit Parameter vom Typ SnippetRow oder mit Parameter vom Typ String. Gibst Du bei mehreren DataRows in Deiner DataTable nur ein Argument bei AddSnippetRow an, hat der Compiler nicht die Auswahl und versucht es aus Deiner Sicht falsch.
    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.
    nice, so funktioniert das, danke schon mal =)

    jetzt müsst ich alle einträge nach namen filtern kann, um zu vermeiden das ein eintrag 2 x mit dem selben namen entsteht

    mit:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. If Not DtsExample.Snippet.Rows.Contains(TextBox1.Text) Then
    2. DtsExample.Snippet.AddSnippetRow(TextBox1.Text, TextBox2.Text, TextBox3.Text, RichTextBox2.Text)
    3. End If


    stürzt es beim 2ten klick auf anlegen einfach ab ?

    und wie kann ich nun auf die einträge zugreifen, also wenn ich in der listbox auf den eintrag klicke, dann von dem entsprechenden eintrag den Code eintrag auslesen ?

    warum muss das so unnötig kompliziert sein... (rumheulen off) :)
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

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

    Einfachste Variante: Du könntest Deine DataRow "Name" auch Unique machen, dann können neue Rows mit gleichem Namen nicht hinzugefügt werden, da beim Versuch ne Exception kommt: System.Data.ConstraintException

    Bei Deinem Code schreit mein Compiler, dass das Prog deshalb abstürzt, weil If Not DtsExample.Snippet.Rows.Contains(TextBox1.Text) nach dem Primärschlüssel sucht (= die automatisch vergebene ID). Da ein TextBox-Text keine Int32-ID sein kann, ist das logisch. Die Suche nach einem DataRow-Inhalt geht anders. Leider muss ich jetzt weg. Aber ich bin ja bei weitem nicht der einzige, der Dir hier weiterhelfen kann. Bis später.
    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 schrieb:

    Du könntest Deine DataRow "Name" auch Unique machen

    VaporiZed schrieb:

    Die DataTable1 enthält nur eine DataRow mit dem Typ String. Diese wird wie o.g. erzeugt
    kleine Berichtigung, was mir gerade beim Lesen aufgefallen ist:
    Eine Tabelle enthält Zeilen(Rows) mit seinen Spalten(Columns)...
    Im Designer erstellt man eine Tabelle mit beliebigen Spalten(Columns) und deren DataType...
    Wenn man einen neuen typisierten Eintrag(Zeileneintrag bzw. Row) der Tabelle hinzufügt,
    dann wird bei der Methode entweder gleich eine vordefinierte typ. Row als Methodenargument oder eine Row mit all seinen Columns als Methoden-Argumente verlangt...
    habs jetzt soweit hinbekommen, das er die Einträge richtig erstellt,
    er kann sie auch beim start wieder entsprechend einladen, aber ich versteh immer noch nicht wie ich jetzt auf alle einträge zugreifen kann

    in meinem Beispiel funktioniert nur alles weil der Index von der Listbox identisch mit der Position in der Tabelle ist,
    wenn ich jetzt aber (sollte ich das in so einem code hinbekommen) einen filter einbauen wollen. z.B. zeige nur einträge deren Name (""irgendEinText) .enthalten
    würde sich ja auch der Index wieder ändern.... echt zum verzweifeln das ganze

    Aktueller beispielcode:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class Main
    3. Dim z As New FileInfo(Application.StartupPath & "\test.xml")
    4. Private DtsExample As New DataSetSnippets
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. MessageBox.Show(DtsExample.Snippet.Count.ToString)
    7. If DtsExample.Snippet.Count > 0 Then
    8. ListBox1.Items.Clear()
    9. For I As Integer = 1 To DtsExample.Snippet.Count
    10. ListBox1.Items.Add(DtsExample.Snippet.Item(I - 1).Name)
    11. Next
    12. End If
    13. ListBox1.Refresh()
    14. End Sub
    15. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    16. If Not DtsExample.Snippet.Rows.Contains(TextBox1.Text) Then
    17. DtsExample.Snippet.AddSnippetRow(TextBox1.Text, TextBox2.Text, TextBox3.Text, RichTextBox2.Text)
    18. End If
    19. End Sub
    20. Private Sub ListView1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
    21. RichTextBox1.Text = DtsExample.Snippet.Item(ListBox1.SelectedIndex).Code
    22. TextBox1.Text = DtsExample.Snippet.Item(ListBox1.SelectedIndex).Name
    23. TextBox2.Text = DtsExample.Snippet.Item(ListBox1.SelectedIndex).Art
    24. TextBox3.Text = DtsExample.Snippet.Item(ListBox1.SelectedIndex).Sprache
    25. RichTextBox2.Text = DtsExample.Snippet.Item(ListBox1.SelectedIndex).Code
    26. End Sub
    27. Private Sub Main_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
    28. DtsExample.WriteXml(z.FullName)
    29. End Sub
    30. Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    31. If File.Exists(z.FullName) Then
    32. Me.DtsExample.ReadXml(z.FullName)
    33. Else
    34. End If
    35. End Sub
    36. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    37. DtsExample.Snippet.Item(ListBox1.SelectedIndex).Name = TextBox1.Text
    38. DtsExample.Snippet.Item(ListBox1.SelectedIndex).Art = TextBox2.Text
    39. DtsExample.Snippet.Item(ListBox1.SelectedIndex).Sprache = TextBox3.Text
    40. DtsExample.Snippet.Item(ListBox1.SelectedIndex).Code = RichTextBox2.Text
    41. End Sub
    42. End Class

    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    ja da steht was von bindingsource, wie kann ich damit jetzt ohne DGV arbeiten, ? die teile sind hässlicher als die nacht dunkel ist^^

    Hab jetzt mal testweise dennoch eins verwendet, wird leider immer nur leer angezeigt...
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

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

    Zum einen lassen sich die TextBoxen an Daten binden, zum anderen das DGV umgestalten. Sieht schon fast aus wie ein ListView.

    EDIT: Öhm ... auch ne ListBox lässt sich anbinden. Klick auf den Smarttag (kleines Dreieck oben rechts an der ListBox), dann "[x] an Daten gebundene Elemente verwenden", Datenquelle = DataSet1BindingSource auswählen, "Member anzeigen" = Name, "Wertemember" = ID. Dann bei ner Textbox über das Eigenschaftenfenster bei "DataBindings", "Erweitert": "Bindung auswählen" -> "DataSet1BindingSource - Sprache". Und wenn Du es dann laufen lässt und das DataSet füllst, füllt sich automatisch die ListBox. Und wenn Du da was auswählst, wird in der TextBox die passende Sprache gezeigt.
    Bilder
    • DGV-LV.png

      8,91 kB, 483×241, 153 mal angesehen
    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 3 mal editiert, zuletzt von „VaporiZed“ ()

    hm, ne bleibt auch leer, egal danke für die help-versuche, aber wenn man sich ein Bein ausreissen und seine Seele verkaufen muss bis das läuft, dann lieber weiter über .txt files
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Nana, wer wird denn gleich soviel Sand in den eigenen Kopf stecken?
    Anbei mal ein Minimalprojekt zum schauen, vielleicht löst sich dann der Gedankenknoten.
    Sobald man die Anfangshürden genommen hat, bekommt man auch günstig die eigene Seele zurück :P
    Dateien
    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 danke dir ^^, aber wie gesagt hinzufügen an sich geht ja schon, ich kann auch als xml abspeichern usw.
    ABER, ich kann mit den daten aus so nem dataset nichts anfangen, ich kann nicht sagen (nur als beispiel)

    Sub blabla handles listbox1.selectedindexchanged

    if (irgendein datenbankeintrag).contains(selecteditem.to String) then
    blaaaa
    end if

    dementsprechend ist es leider für meine Zwecke useless


    über txt dateien simple as can be, alle filenamen eines verzeichnisses ohne dateinamenerweiterung als string einlesen, jeden einzelnen davon in der Listbox laden,
    wenn ich auf einen davon klicke wird der Inhalt der Txt angezeigt -- easy

    nur halt nervig da für jeden Eintrag eine einzelne datei angelegt wird, mit einem Dataset könnte ich das halt Problemlos in einer File Regeln (und evtl. auch filter einbauen)
    aber wenn die .net entwickler solch mächtige sachen, so unnutzbar schwer programmieren, dann kann man diese halt nicht nutzen.
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Das ist richtig. Weil immer noch die Aussage gilt: ListBox und Co sind nur zur Darstellung von Daten gedacht. Bei der Verwendung eines DataSets greift man auf selbiges oder notfalls auf die BindingSource zu, um an die Daten zu kommen:

    VB.NET-Quellcode

    1. For Each DataRow In DataSet1.DataTable1
    2. If DataRow.Sprache = "VB6" Then Stop
    3. Next

    Der Zugriff erfolgt z.B. über das DataSet, wenn man allgemein darin was suchen will. Die BindingSource, wenn man vor allem auf den momentan ausgewählten Eintrag zugreifen will. Und zwar z.B., wenn man in einer gebundenen ListBox das SelectedItem ändert, ändert sich auch die Position in der BindingSource, sodass in der dahinterliegenden Datentabelle das ausgewählt und ggf. bearbeitet wird, was in der ListBox ausgewählt ist.
    btw: Bei meinem Beispielprojekt ging es eher um die Datenbindung an ListBox und TextBox als um den Code.
    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.
    ich werds gleich mal so versuchen

    zu deinem letzten Text:
    Wenn einem schon beim lesen schwindlig wird, mit dataset hier bindingsource da (ich weiss ja noch nicht mal was diese bindingsource sein soll) dann ist klar das solche sachen einfach sinnfrei schwer sind...
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

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