Überprüfen ob ein Eintrag im Dataset schon existiert

  • VB.NET

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

    Überprüfen ob ein Eintrag im Dataset schon existiert

    Hallo Leute,
    ich habe eine kurze Frage. Ich schreibe immer noch an meinem Vokabeltrainer. Ich habe ein Dataset welches der User über eine Datagridview quasi selbst bearbeiten kann. Allerdings kriege ich eine Fehlermeldung wenn ich ein neues Wort hinzufügen möchte, welches schon existiert (was ja auch richtig ist).
    Wie kann ich jetzt aber dem Programm sagen, dass wenn z.b. ein Eintrag schon existiert eine msg-Box angezeigt wird?

    Hier mein Code zum Klick des "add"-Buttons:

    VB.NET-Quellcode

    1. Private Sub btnadd_Click(sender As Object, e As EventArgs) Handles btnadd.Click
    2. Dim newRow = CType(Me.VokabelDataset1.Vokabeln.NewRow(), VokabelDataset.VokabelnRow)
    3. newRow.German = txt1.Text
    4. newRow.English = txt2.Text
    5. Me.VokabelDataset1.Vokabeln.Rows.Add(newRow)
    6. txt1.Clear()
    7. txt2.Clear()
    8. End Sub


    thx a lot

    J
    Versuch einfach, den Wert auszulesen, bevor Du ihn reinschreibst.
    Wenn das funktioniert, isser schon da, wenn nicht, schreib ihn rein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich weiß das klingt jetzt doof.... aber ich steig einfach nicht dahinter wie ich eine linq-Abfrage erstelle...
    Und finde auch keinen Ansatz dafür, die Prüfung vor dem erstellen des Eintrages zu machen...
    bin grad furchtbar überfordert...
    Hallo Leute....
    sitze jetzt seit einer gefühlten Ewigkeit immer noch an dem Problem und bin bisher noch nicht viel weiter gekommen.

    Was ich woanders im I-Net gelesen habe:

    VB.NET-Quellcode

    1. Public Function GetRowExists(ByVal word As String) As Boolean
    2. For Each w As Data.DataRow In VokabelDataset1.Vokabeln.Rows
    3. If w("German") Is word Then
    4. Return True
    5. else: return false
    6. end if
    7. Next
    8. End Function
    9. Private Sub btnadd_Click(sender As Object, e As EventArgs) Handles btnadd.Click
    10. If Not GetRowExists(txt1.Text) Then
    11. Dim newRow = CType(Me.VokabelDataset1.Vokabeln.NewRow(), VokabelDataset.VokabelnRow)
    12. Me.VokabelDataset1.Vokabeln.Rows.Add(newRow)
    13. newRow.German = txt1.Text
    14. newRow.English = txt2.Text
    15. txt1.Clear()
    16. txt2.Clear()
    17. Else : MsgBox("Fehler")
    18. End If
    19. End Sub


    funzt genauso wenig wie vorher. (Fehlermeldung: Eine nicht behandelte Ausnahme des Typs "System.Data.NoNullAllowedException" ist in System.Data.dll aufgetreten. Zusätzliche Informationen: Spalte 'German' läßt nicht 'nulls' zu.)

    Wollte es mit einer Funktion probieren, die quasi zählt wieviele Einträge mit dem "Wert" txt1.text existieren und wenn halt 0 rauskommt existiert es nicht. Aber auch daran bin ich kläglich gescheitert.

    Das Testprogramm welches verlinkt wurde (
    vielleicht hilft dir das weiter -> [VB 2010] LinqToDataset
    ) hat mir nicht so wirklich geholfen. Und auch dieses Programm crasht wenn ich eine ID per Hand eingebe, die es schon gibt.

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

    eieiei... Sorry for that!

    Fehlerzeile:

    VB.NET-Quellcode

    1. Me.VokabelDataset1.Vokabeln.Rows.Add(newRow)


    Fehlermeldung siehe oben( "Eine nicht behandelte Ausnahme des Typs "System.Data.NoNullAllowedException" ist in System.Data.dll aufgetreten. Zusätzliche Informationen: Spalte 'German' läßt nicht 'nulls' zu.")
    Hab jetzt nen anderen Ansatz über nen Rowfilter... leider funzt es immer noch nicht ganz.... das Programm stürzt zwar nicht ab und es kommt auch die erwünschte Messagebox... allerdings kann ich nun auch keine neuen Wörter mehr eingeben... ich hab das Gefühl ich hätte iwas übersehen. Könnte einer von unsere Pros da mal drüber schauen?

    VB.NET-Quellcode

    1. Private Sub btnadd_Click(sender As Object, e As EventArgs) Handles btnadd.Click
    2. Dim Dview As New DataView(VokabelDataset1.Vokabeln)
    3. Dview.RowFilter = "German = '" + txt1.Text + "'"
    4. If Dview.RowFilter.Count = 0 Then
    5. Dim newRow = CType(Me.VokabelDataset1.Vokabeln.NewRow(), VokabelDataset.VokabelnRow)
    6. newRow.German = txt1.Text
    7. newRow.English = txt2.Text
    8. Me.VokabelDataset1.Vokabeln.Rows.Add(newRow)
    9. txt1.Clear()
    10. txt2.Clear()
    11. Else : MsgBox("this word is already in the list!")
    12. End If
    13. End Sub
    mit post#10 willichmich nicht beschäftigen, weil dein Fehler war so schön einfach.
    Der Fehler in Post#7 lautet: "Spalte 'German' läßt nicht 'nulls' zu."

    Jo, und zum Zeitpunkt des Addens der newRow - welchen Wert hat da die Spalte German ?

    Und guck eine Zeile weiter - ah - da wird die Spalte German ja erst gesetzt - klingelts?
    Das dachte ich auch... aber 1.existiert die Spalte "German" ja schon längst und 2. es sind ja auch schon ne Menge Werte darin und 3. (was mich nun komplett verwirrt) habe ich mal die erstellte Function (GetRowExists) inkl. der If-Formulierung komplett rausgenommen. Ich habe die selbe Fehlermeldung bekommen obwohl alles wie vorher war als ich noch problemlos neue (noch nicht vorhandene) Wörter hinzufügen konnte. Erst das komplette Löschen des Befehls und Neueingabe per Hand (auf den Punkt genau dasselbe ?( ) konnte das beheben. Nun hab ich Stück für Stück die Funktion und die If-Anweisung wieder hinzugefügt und tatsächlich kommt nicht mehr der "Eine nicht behandelte Ausnahme des Typs "System.Data.NoNullAllowedException" ist in System.Data.dll aufgetreten. Zusätzliche Informationen: Spalte 'German' läßt nicht 'nulls' zu."-Text sondern:

    "Eine nicht behandelte Ausnahme des Typs "System.Data.ConstraintException" ist in System.Data.dll aufgetreten.
    Zusätzliche Informationen: Die Spalte 'German' hat die Einschränkung, dass sie eindeutig sein muss. Der Wert 'a' ist bereits vorhanden." (selbe Fehlerzeile)

    Ich hab ein bissl rumprobiert und kam zu dem Schluss, dass meine Function einfach keinen True-Wert auswirft. Nur weiß ich auch nicht, was an der Function falsch sein soll?

    Ich hoffe, ich konnt es halbwegs erklärlich beschreiben. Vielen Dank für die Geduld!
    jo, ich hab auch mühe mitte geduld.

    Also vertausche einfach mal die Zeilen #11 und #12 - ist mir jetzt egal, ob du kapierst, dass die zu einer DataTable gehörende DataRow ebenfalls die Spalten (alias Properties) hat, und dass die in dem Fall eben erst gesetzt sein muß, bevor die DataRow geadded werden kann.
    Sorry... aber das hab ich nicht bemerkt.... hatte es ursprünglich mal genau so... nun wird's mir klar. :S
    jetzt kann ich wieder normal Zeilen adden... nur an der Function GetRowExists muss ich noch arbeiten, da sie keinen Wert "true" auswirft auch wenn die Row schon existiert.

    @ErfinderDesRades: nicht böse sein, bitte!

    Edit:

    hab das mit der Fuction hinbekommen.... konnt ja auch gar nicht gehen, da ich einen String in eine DataRow umwandeln wollte (bzw umgekehrt)!

    Hab es jetzt so gelöst:

    VB.NET-Quellcode

    1. Public Function GetRowExists(ByVal word As String) As Boolean
    2. Dim x As Integer
    3. x = CInt(VokabelDataset1.Vokabeln.Rows.Count - 1)
    4. For i = 0 To x
    5. If word = VokabelDataset1.Vokabeln.Rows(i).Item(0).ToString Then
    6. Return True
    7. End If
    8. Next
    9. Return False
    10. End Function
    11. Private Sub btnadd_Click(sender As Object, e As EventArgs) Handles btnadd.Click
    12. If GetRowExists(txt1.Text) = False Then
    13. Dim newRow = CType(Me.VokabelDataset1.Vokabeln.NewRow(), VokabelDataset.VokabelnRow)
    14. newRow.German = txt1.Text
    15. newRow.English = txt2.Text
    16. Me.VokabelDataset1.Vokabeln.Rows.Add(newRow)
    17. txt1.Clear()
    18. txt2.Clear()
    19. Else : MsgBox("this word already exists!")
    20. End If
    21. End Sub



    Kann man das so schreiben?

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

    und weiters hast du ein typisiertes Datset. Das sollteste dir mal im ObjectBrowser ausführlich angugge, was das so alles drauf hat.
    Zum Beispiel implementiert die VokabelnDataTable IEnumerable(Of VokabelnRow), weshalb du sehr elegant Linq einsetzen kannst:

    VB.NET-Quellcode

    1. Public Function GetRowExists(ByVal word As String) As Boolean
    2. Return Me.VokabelDataset1.Vokabeln.Any(Function(rw) rw.German = word)
    3. End Function
    Jo, nun finde heraus, was IEnumerable(Of T) bedeutet, und was die Extension-Methode .Any() damit anstellt, insbes. was sie zurückgibt :D

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