Dataset "Zeile gehört schon zu dieser Tabelle"

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

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

    Dataset "Zeile gehört schon zu dieser Tabelle"

    Hallo,

    und mal wieder bin es ich und mal wieder geht es wieder um das Thema Dataset.

    Also mein Problem ist momentan dass abspeichern der Daten. Diese werden von mir vorher aus einer textdatei gefiltert und dann die Daten den Spalten zu orten und der Tabelle hinzufügen. doch irgendwie will das abspeichern nicht funktionieren.

    Hiermal mein Code:

    VB.NET-Quellcode

    1. Public Sub dataread()
    2. Dim dr = GHK1.Preise.NewPreiseRow
    3. For Each line As String In System.IO.File.ReadAllLines(My.Application.Info.DirectoryPath & "\entpackt\DATANORM.001", System.Text.Encoding.GetEncoding(850))
    4. If line.IndexOf("T;") = 0 Then
    5. If Regex.Match(line, ";[0-9]{1};;", RegexOptions.IgnoreCase).ToString = ";1;" Then
    6. dr.Zuordnung = Regex.Match(line, "[0-9]{4,}", RegexOptions.IgnoreCase).Value
    7. dr.Name = Regex.Matches(line, ";1;;[(a-z)(0-9)äüö\""\*\-\s\.$]{1,}", RegexOptions.IgnoreCase)(0).Value
    8. dr.Beschreibung = Regex.Matches(line, ";2;;[(a-z)(0-9)äüö\""\*\-\s\.$\+\/]{1,}", RegexOptions.IgnoreCase)(0).Value
    9. GHK1.Preise.AddPreiseRow(dr)
    10. ElseIf Regex.IsMatch(line, "Artikel", RegexOptions.IgnoreCase) = True Then
    11. dr.Zuordnung = Regex.Match(line, "[0-9]{4,}", RegexOptions.IgnoreCase).Value
    12. dr._Artikel_Nr_ = Regex.Match(line, "Artikel-Nr.:[(a-z)(0-9)]", RegexOptions.IgnoreCase).Value
    13. dr.Beschreibung = Regex.Match(line, "[(a-z)äüö\s]{2,}", RegexOptions.IgnoreCase).Value
    14. GHK1.Preise.AddPreiseRow(dr)
    15. ElseIf Regex.Matches(line, "[(a-z)äüö\s]{2,}", RegexOptions.IgnoreCase).Count = 2 Then
    16. dr.Zuordnung = Regex.Match(line, "[0-9]{4,}", RegexOptions.IgnoreCase).Value
    17. dr.Beschreibung = Regex.Matches(line, "[(a-z)äüö\s]{2,}", RegexOptions.IgnoreCase)(0).Value
    18. dr.Beschreibung = Regex.Matches(line, "[(a-z)äüö\s]{2,}", RegexOptions.IgnoreCase)(1).Value
    19. GHK1.Preise.AddPreiseRow(dr)
    20. ElseIf Regex.Matches(line, "[(a-z)äüö\s]{2,}", RegexOptions.IgnoreCase).Count = 1 Then
    21. dr.Zuordnung = Regex.Match(line, "[0-9]{4,}", RegexOptions.IgnoreCase).Value
    22. dr.Beschreibung = Regex.Matches(line, "[(a-z)äüö\s]{2,}", RegexOptions.IgnoreCase)(0).Value
    23. GHK1.Preise.AddPreiseRow(dr)
    24. End If
    25. GHK1.Preise.WriteXml("Preise.xml")
    26. End If
    27. Next
    28. End Sub


    doch bei

    VB.NET-Quellcode

    1. GHK1.Preise.AddPreiseRow(dr)


    kommt immer die fehlermeldung:
    {"Diese Zeile gehört bereits zu dieser Tabelle."}


    Aber auf einer anderen Form funktioniert der code komischer weiße:

    VB.NET-Quellcode

    1. Dim log = Lo1.data.NewdataRow
    2. log.Login = UsernameTextBox.Text
    3. log.Password = MD5StringHash(PasswordTextBox.Text)
    4. Lo1.data.AdddataRow(log)
    5. Lo1.WriteXml("lo.xml")


    ich verstehe da jetzt den Grund der o.g. Fehlermeldung nicht ?(
    Du kannst dr nicht dem DataSet hinzufügen, dr ändern und sie erneut zufügen. Du musst dr immer mit new bei jedem Schleifendurchgang neu anlegen. sonst gibt's Mecker.
    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.
    Sorry wenn ich diesen alten Thread aufgreife. Aber das Thema passt perfekt zu meinem Problem, und wollte daher keinen neuen Thread eröffnen.
    Ich durchlaufe in einer For-Each Schleife die Zeilen eines DataGridView. Die Daten aus den Zeilen will ich über ein typisiertes DataSet in eine XML-Datei schreiben.

    Beim durchlaufen der Schleife bekomme ich immer die Fehlermeldung : "Diese Zeile gehört bereits zu dieser Tabelle!"

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim neuezeile = DSAufträge.Komplett.NewKomplettRow
    3. Dim index = 0
    4. For Each row In DGV1.Rows
    5. For i = index To DGV1.Rows.Count - 1
    6. neuezeile._A_Nr_D = DGV1.Rows(index).Cells(0).Value.ToString
    7. neuezeile.Kunde = DGV1.Rows(index).Cells(9).Value.ToString
    8. DSAufträge.Komplett.AddKomplettRow(neuezeile)
    9. index += 1
    10. Next
    11. Next
    12. End Sub


    Verstehe den Hinweis von @VaporiZed zwar, weiß aber nicht wie und wo ich "NEW" eibringen muss damit das klappt. Muss ja beim erneuten durchlaufen der Schleife eine neue Zeile erzeugen, aber wie gehe ich da ran?
    Vaporizeds Aussage ist fast richtig, nur bei DataRows gibts kein zugreifbares new.
    Stattdessen gibts das KomplettDataTable.NewKomplettRow() As KomplettRow (was du ja bereits benutzst), und das ist ein vollwertiger Ersatz für das für andere Klassen übliche new.
    Ansonsten probierma

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim index = 0
    3. For Each row In DGV1.Rows
    4. For i = index To DGV1.Rows.Count - 1
    5. Dim neuezeile = DSAufträge.Komplett.NewKomplettRow
    6. neuezeile._A_Nr_D = DGV1.Rows(index).Cells(0).Value.ToString
    7. neuezeile.Kunde = DGV1.Rows(index).Cells(9).Value.ToString
    8. DSAufträge.Komplett.AddKomplettRow(neuezeile)
    9. index += 1
    10. Next
    11. Next
    12. End Sub
    Obs hilft weiss ich nicht, weil ich versteh den Code nicht mit der Foreach-Schleife (zeile #4), wo noch eine For i - Schleife drinne ist (#5).
    Jedenfalls wenn du ein AddKomplettRow(neuezeile) ausführst, kannste dieselbe neuezeile nicht nochmal adden - das sagte ja schon die Fehlermeldung.
    Daher wiegesagt mit KomplettDataTable.NewKomplettRow() im nächsten Schleifendurchgang eine neue neuezeile erzeugen.

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

    Hallo ErfinderDesRades,

    danke vorweg für deine Antowrt.

    Die For-Each Schleife in Zeile 4 ist denke ich überflüssig. Hab die mal rausgeschmisssen. Die zweite For Schleife sollte das erledigen.
    Hatte die "neuezeile" in der zweiten Schleife auch probiert, funzte aber nicht weil ich dann die Meldung bekam "Die Objektinstanz wurd enicht festgelegt."
    Denke das liegt an den DataRows im DataSet, die einen DBNull-Wert haben. Werd den Code probieren, mal sehen ob das klappt.

    Danke für deine Mühe, hab vorher bestimmt den halben Tag probiert und gesucht und kam nicht weiter.
    Hab herausgefunden worans liegt. Das DGV füttere ich mit Daten aus einer Excel Tabelle. Die Tabelle habe ich innerhalb noch mal als Tabelle mit einem bestimmten Zellbereich definiert. Daher zählte die Schleife auch deutlich länger als Datensätze enthalten waren. Hab nun die "Tabelle" auf zwei Zeilen gekürzt, die Zeilen werden nun ergänzt. Aber meine Datensätze will er nicht übernehmen.

    Hab nun für jede Zeile eine If-Abfrage erstellt, damit der DBNull keine Exception auslöst. Die DataTable über die ich in die XML schreiben will, lässt das nicht anders zu.
    Nur meine Zeilen bleiben leer. Hab glaube ich iwo einen Denkfehler. Nur wo?

    VB.NET-Quellcode

    1. Dim index = 0
    2. For Each row In DGV1.Rows
    3. For i = index To DGV1.Rows.Count - 2
    4. Dim neuezeile = DSAufträge.Komplett.NewKomplettRow
    5. DSAufträge.Komplett.AddKomplettRow(neuezeile)
    6. neuezeile._A_Nr_D = DGV1.Rows(index).Cells(0).Value.ToString
    7. neuezeile._Auf_Wert = CDec(DGV1.Rows(index).Cells(1).Value.ToString)
    8. neuezeile.LW = CInt(DGV1.Rows(index).Cells(2).Value.ToString)
    9. neuezeile.Vertreter_Name = DGV1.Rows(index).Cells(70).Value.ToString
    10. DSAufträge.Komplett.AcceptChanges()
    11. index += 1
    12. Next


    Edit: funzt nun. Im DataGridView wurden 3 Zeilen dargestellt, warum auch immer. Bei der Übergabe an die DataTable kamm dann immer die Fehlermeldung mit DBNull.
    , weil nur zwei Zeilen Datensätze enthielten. Jetzt gehts auf jeden Fall. Danke

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