Dataset Update zu SQL Datenbank

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Romario_Castanyeda.

    Dataset Update zu SQL Datenbank

    Hallo,

    ich bin doch eher Anfänger und versuche mich an meiner ersten App. mit VB 2010 und SQL Datenbank.

    Mein Problem ist, dass die Update-Methode des Dataset nicht funktioniert:

    Auch nachfolgendes Standartbeispiel funktioniert nicht...

    Das Debuggen startet mit dem Sub "Automatisch"

    Die Datenbank wird korrekt angesprochen und das Dataset befüllt. Nachdem die Daten geändert wurden, erfolgt in Sub Aktuallisieren

    zunächst eine Testausgabe, ob das Dataset auch korrekt befüllt ist und geändert wurde...

    Alles läuft gut.

    Jedoch wird die Änderung nicht in die Datenbank übernommen.

    Nachfolgend der Code:

    VB.NET-Quellcode

    1. #Region "Test"
    2. Public Sub Automatisch()
    3. Dim da As DbDataAdapter, ds As DataSet
    4. Lesen(da, ds)
    5. Dim cmb As DbCommandBuilder = New SqlCommandBuilder()
    6. cmb.DataAdapter = da
    7. Ändern(ds, False)
    8. Aktualisieren(da, ds)
    9. End Sub
    10. '*****************************************************************
    11. Public Sub Lesen(ByRef da As DbDataAdapter, ByRef ds As DataSet)
    12. Dim conn As DbConnection = New SqlConnection()
    13. conn.ConnectionString = Anmeldestring
    14. Dim cmd As DbCommand = New SqlCommand()
    15. cmd.CommandText = "SELECT * FROM table_Test"
    16. cmd.Connection = conn
    17. ds = New DataSet() : da = New SqlDataAdapter()
    18. da.SelectCommand = cmd
    19. da.FillSchema(ds, SchemaType.Source)
    20. da.Fill(ds)
    21. End Sub
    22. '******************************************************************
    23. Public Sub Ändern(ByVal ds As DataSet, ByVal name As Boolean)
    24. ds.Tables(0).Rows(3)("bemerkung") = "ssss"
    25. End Sub
    26. '*******************************************************************
    27. Public Sub Aktualisieren(ByVal da As DbDataAdapter, ByVal ds As DataSet)
    28. 'Anmeldename wird korrekt ausgegeben
    29. 'Das bedeutet, dass das Dataset korrekt aus der Datenbank eingelesen worden ist.
    30. Dim test = ds.Tables(0).Rows(3)("anmeldename") ' funktioniert (Name wird ausgegeben)
    31. 'Bemerkungen = ssss .... wie in Ändern bestimmt.
    32. Dim test2 = ds.Tables(0).Rows(3)("bemerkung") ' funktioniert
    33. Dim betroffen As Integer = 0
    34. Try
    35. betroffen = da.Update(ds) ' hier liegt der Fehler. Es erfolgt kein Update
    36. 'Ausgabe betroffen = 0 ---> , sprich die Datenbank erhielt kein Update.
    37. Catch ex As Exception
    38. Console.WriteLine("Fehler: {0}", ex.Message)
    39. End Try
    40. Console.WriteLine("{0} Datenzeilen aktualisiert", betroffen)
    41. Console.ReadLine()
    42. MsgBox("betroffene Datenzeilen = " & betroffen) ' = 0
    43. End Sub
    44. '***********************************************
    45. #End Region


    'Ende Code

    Ich bitte um Hilfe.

    Gruß RC

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

    Wenn man die DB-DAtei dem Projekt zugefügt hat, hat sie Eigenschaften, unter anderem die Eigenschaft "Ins Ausgabeverzeichnis kopieren".
    WEnn diese Eigenschaft auf "Immer" steht, kopierter sie bei jedem Testlauf neu ins Ausgabeverzeichnis (..\bin\Debug), und überschreibt damit die Änderungen des vorherigen Testlaufes.
    Danke für die Antwort.

    Ich verstehe sie auch, jedoch nicht machbar, da die DB-Datei auf dem SQL-Server im Multiuserzugriff ist.

    Was ich nicht verstehe ist folgendes:

    Bei der Fill-Methode wird ein Command benötigt.

    Dieser fehlt hier vollständig. Soweit ich das jedoch verstanden habe, merkt sich das dataset jedoch die Änderungen, gleicht diese ab und überträgt dann mit der Update-Methode die Daten über den DbDataAdapter zur Datenbank, welcher durch den DbCommandBuilder angestoßen wird (beinhaltet den CommandUpdate-Befehl).

    Entweder ist dieser nicht zur Laufzeit aktuell (da dim und nicht public) oder das Dataset merkt sich nicht die Veränderungen im Dataset (tables(0))... oder sonstwas...

    Mir geht es auch um das Verständnis warum es nicht geht...

    Helfen würde mir ein lauffähiges Beispiel:

    Eine Tabelle ("Testtabelle) hat 2 Spalten und 3 Zeilen.

    Spalte 1 = id

    Spalte 2 = Wert

    Zeile 1 = (1,"Zeile1")

    Zeile 2 = (2,"Zeile2")

    Zeile 1 = (3,"Zeile3")

    Diese Daten sollen mit der Fill-Methode in das Dataset geladen werden.

    Dann soll Zeile 2 in soweit geändert werden, dass der Wert = "Geändert" lautet -->

    Zeile 2 = (2,"Geändert")

    Nun soll die Updatemethode diese Daten in die Datenbank übertragen...

    Wenn jemand so liebendswert wäre mir hierfür einen Code zu generieren?

    Hier wäre eine kleine Vorgabe, von dem was ich meine:

    VB.NET-Quellcode

    1. #Region "Test"
    2. Public Sub Lesen_ändern_rückschreiben(ByRef da As DbDataAdapter, ByRef ds As DataSet)
    3. Dim conn As DbConnection = New SqlConnection()
    4. conn.ConnectionString = Anmeldestring
    5. Dim cmd As DbCommand = New SqlCommand()
    6. cmd.CommandText = "SELECT * FROM Testtabelle"
    7. cmd.Connection = conn
    8. ds = New DataSet() : da = New SqlDataAdapter()
    9. da.SelectCommand = cmd da.FillSchema(ds, SchemaType.Source)
    10. da.Fill(ds)
    11. 'Nun erfollgt die Änderung des Dataset in Zeile 2 = Rows(1):
    12. ds.Tables(0).Rows(1)("wert") = "Geändert"
    13. '**** Nun kommt der für mich nicht verständliche Teil:
    14. '**** benötig der DbDataAdapter (da) keine Commandzeile?
    15. '**** z.B. da.SelectCommand = cmd da.CommandUpdate(ds, conn)
    16. da.Update(ds)
    17. End Sub
    18. #End Region


    Danke für die Mühe im Voraus..

    Ich hoffe, dass ich mich verständlich ausdrücken konnte.
    Es gibt ein Problem, nämlich dass meine ServerInstanz anders heißt als deine.

    Du mußt also mit einer Volltext-Ersetzung "SqlExpress2008" ersetzen durch "SqlExpress", im gesamten Projekt.

    Das ganze Gewurstel mit Commands und CommandBuilder etc. habe ich den Designer machen lassen, siehe das Tutorial "Datenbank in 10 Minuten" auf Movie-Tuts

    Das korrekte Speichern kannst du überprüfen, indem du die Daten änderst, dann speicherst, dann nochmal änderst, dann neu lädst.
    Dann muß der Stand vom Speichern kommen.

    Bei einem neuen Testlauf hingegen wird die Datenbankdatei überschrieben, und alle Änderungen sind futsch.
    Dateien
    • Testdaten00.zip

      (188,75 kB, 285 mal heruntergeladen, zuletzt: )