Dataset - Bei neueintragung wird erste Eintragung überschrieben

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

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Dataset - Bei neueintragung wird erste Eintragung überschrieben

    Servus,

    also bei mir ist heute ein neues verhalten im Dataset aufgetreten. Undzwar hab ich ein Anmeldebildschirm bzw. für dies ein Registrierungsformular (ist ja klar, man muss sich erstmal Registrieren um sich einloggen zu können)
    Jetzt ist es aber so, das wenn ich die Daten von der Registrierung in mein Dataset abspeichere, dann Überschreibt er mir immer den ersten eintrag und fügt das Passwort als klartext mit ein (es wird mit md5 gehasht)

    hiermal ein bild


    ich habe zuerst den Namen "2" erstellt und da sieht man dahinter das Passwort, dann habe ich den Namen "1" erstellt und schon ändert er den ersten eintrag (sieht man an unter der spalte "ID")

    Hiermal der Code:

    VB.NET-Quellcode

    1. Dim Logindaten As DataRow = DataSet1.Login.NewRow
    2. Logindaten("Name") = LoginTextBox.Text
    3. Logindaten("Password") = MD5StringHash(PasswordTextBox.Text)
    4. DataSet1.Login.Rows.Add(Logindaten)


    und hier noch vom MD5:

    VB.NET-Quellcode

    1. Public Function MD5StringHash(ByVal strString As String) As String
    2. Dim MD5 As New MD5CryptoServiceProvider
    3. Dim Data As Byte()
    4. Dim Result As Byte()
    5. Dim Res As String = ""
    6. Dim Tmp As String = ""
    7. Data = Encoding.ASCII.GetBytes(strString)
    8. Result = MD5.ComputeHash(Data)
    9. For i As Integer = 0 To Result.Length - 1
    10. Tmp = Hex(Result(i))
    11. If Len(Tmp) = 1 Then Tmp = "0" & Tmp
    12. Res += Tmp
    13. Next
    14. Return Res
    15. End Function
    *unnötiges Zitat entfernt*

    Das ist ja das komische... aber mehr Code habe ich aber nicht :O bzw. Da kommt noch die .ReadXML und die .WriteXML methode und das war es! ich bin echt ratlos deswegen... wie gesagt, es ist das erstmal das so ein verhalten vorhanden ist...

    EDIT:
    ich habe jetzt mal den Primärschlüssel auf die Spalte Namen gelegt, aber ich kann immer noch den gleichen Namen mehrmals vergeben, ohne das er mir eine Fehlermeldung bringt :O und der fehler mit dem abändern kommt immer noch :(

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

    Das kann nicht der komplette Code sein, denn ich habe folgendes:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class FrmMain
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim Logindaten As Data.DataRow = DataSet1.Login.NewRow
    4. Logindaten("Name") = TextBox1.Text
    5. Logindaten("Password") = MD5StringHash(TextBox2.Text)
    6. DataSet1.Login.Rows.Add(Logindaten)
    7. End Sub
    8. Public Function MD5StringHash(ByVal strString As String) As String
    9. Dim MD5 As New Security.Cryptography.MD5CryptoServiceProvider
    10. Dim Data As Byte()
    11. Dim Result As Byte()
    12. Dim Res As String = ""
    13. Dim Tmp As String = ""
    14. Data = System.Text.Encoding.ASCII.GetBytes(strString)
    15. Result = MD5.ComputeHash(Data)
    16. For i As Integer = 0 To Result.Length - 1
    17. Tmp = Microsoft.VisualBasic.Hex(Result(i))
    18. If Microsoft.VisualBasic.Len(Tmp) = 1 Then Tmp = "0" & Tmp
    19. Res += Tmp
    20. Next
    21. Return Res
    22. End Function
    23. End Class


    Und es kommt raus:

    Ggf. bitte mal Dein bereinigtes Projekt gezippt hochladen.

    btw: Du arbeitest bei der Zeilenerstellung untypisiert und mit VisualBasic-Namespace. Aber das ist ein anderes Thema.

    EDIT: Und das mit der Primärspalte kann auch nicht sein. Da kommt bei mir ne saubere ConstraintException, wenn ich die als Unique setze und 2x den gleichen Namen verwenden will. Poste mal bitte nen Screenshot Deiner tDS-DataTable mit offener Eigenschaftentabelle der Name-Column.
    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.
    Diese Antwort ist verwirrend, weil sie mit dem gezeigten Code nicht nachvollziehbar ist. Laut Deinem Code wird eine neue Zeile erstellt, modifiziert und der DataTable hinzugefügt. Fertig. Nichts anderes. Daher: Welche Zeile führt denn Deinen Recherchen nach zu dem Fehler?

    untypisiert sind diese Zeilen:

    VB.NET-Quellcode

    1. Dim Logindaten As DataRow = DataSet1.Login.NewRow
    2. Logindaten("Name") = LoginTextBox.Text
    3. Logindaten("Password") = MD5StringHash(PasswordTextBox.Text)

    Das Indizieren von Spalten per String (Logindaten("Password")) ist untypisiert, fehleranfällig (verschreib Dich mal und es geht nix mehr) und ohne IntelliSense-Unterstützung. Statt DataSet1.Login.NewRow solltest Du DataSet1.Login.NewLoginRow verwenden. Denn es soll ja nicht eine allgemeine DataRow erstellt werden, sondern eine vom Typ LoginDataRow. Daraufhin kannst Du nämlich ohne Verwendung von such-mir-die-Spalte-mit-folgendem-Namen-Code folgendes schreiben:

    VB.NET-Quellcode

    1. Dim Logindaten = DataSet1.Login.NewLoginRow
    2. Logindaten.Name = LoginTextBox.Text
    3. Logindaten.Password = MD5StringHash(PasswordTextBox.Text)
    4. DataSet1.Login.Rows.Add(Logindaten)

    VB-Namespace:
    Nimm in den Projekteigenschaften bei Verweisen den importierten Namespace Microsoft.VisualBasic raus. Dann werden VisualBasic-6-Kandidaten wie Len und Hex plötzlich unbrauchbar. Denn statt Len solltest Du tmp.Length (= objektorientiert) verwenden. Bei Hex kann man sich der Bequemlichkeit halber streiten, aber ich wage zu behaupten, dass es auch dort objektorientierte Ersatzfunktionen gibt, z.B. Result(i).ToString("X")
    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.