DataSet speichern - Überschreiben, nicht anhängen!

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Leonalter.

    DataSet speichern - Überschreiben, nicht anhängen!

    Hallo,

    momentan bastel ich an Einstellungsmöglichkeiten meines Projektes herum. Um diese zu speicher nutze ich ein vorhandenes Dataset und speichere die Settings in einer .xml Datei ab.
    Nun habe ich allerdings bemerkt, dass da etwas gehörig schief läuft...

    Spoiler anzeigen

    XML-Quellcode

    1. <?xml version="1.0" standalone="yes"?>
    2. <ProjectDataSet xmlns="http://tempuri.org/ProjectDataSet.xsd">
    3. <settings>
    4. <tray>false</tray>
    5. <autoupates>true</autoupates>
    6. <loadprojectauto>false</loadprojectauto>
    7. <channels>8</channels>
    8. <audio>true</audio>
    9. <a>255</a>
    10. <r>154</r>
    11. <g>205</g>
    12. <b>50</b>
    13. </settings>
    14. <settings>
    15. <tray>false</tray>
    16. <autoupates>true</autoupates>
    17. <loadprojectauto>false</loadprojectauto>
    18. <channels>8</channels>
    19. <audio>true</audio>
    20. <a>255</a>
    21. <r>154</r>
    22. <g>205</g>
    23. <b>50</b>
    24. </settings>
    25. <settings>
    26. <tray>false</tray>
    27. <autoupates>true</autoupates>
    28. <loadprojectauto>false</loadprojectauto>
    29. <channels>8</channels>
    30. <audio>true</audio>
    31. <a>255</a>
    32. <r>154</r>
    33. <g>205</g>
    34. <b>50</b>
    35. </settings>
    36. <settings>
    37. <tray>true</tray>
    38. <autoupates>true</autoupates>
    39. <loadprojectauto>false</loadprojectauto>
    40. <channels>8</channels>
    41. <audio>true</audio>
    42. <a>255</a>
    43. <r>154</r>
    44. <g>205</g>
    45. <b>50</b>
    46. </settings>
    47. <settings>
    48. <tray>false</tray>
    49. <autoupates>true</autoupates>
    50. <loadprojectauto>false</loadprojectauto>
    51. <channels>8</channels>
    52. <audio>true</audio>
    53. <a>255</a>
    54. <r>154</r>
    55. <g>205</g>
    56. <b>50</b>
    57. </settings>
    58. <settings>
    59. <tray>false</tray>
    60. <autoupates>true</autoupates>
    61. <loadprojectauto>false</loadprojectauto>
    62. <channels>8</channels>
    63. <audio>true</audio>
    64. <a>255</a>
    65. <r>154</r>
    66. <g>205</g>
    67. <b>50</b>
    68. </settings>
    69. </ProjectDataSet>


    Wie man sieht, wird beim speichern (DataSet.WriteXML) die neuen Daten angehangen, nicht aber überschrieben. Im DataSet ändere ich die Werte nur bei dem Item(0).

    Leider finde ich keine Möglichkeit, dies außer die Datei vor dem speichern zu löschen zu lösen. Gibt es da nicht eine bessere Möglichkeit?

    Gruß
    Leon

    Leonalter schrieb:

    Wie man sieht, wird beim speichern (DataSet.WriteXML) die neuen Daten angehangen, nicht aber überschrieben.
    Sorry - ich sehe das nicht - woran kannman das erkennen?

    Und bist du dir sicher, dass dieses Anhängen beim Abspeichern stattfindet?
    Viel häufiger ist der Fall, dass beim Einlesen vergessen wird, das Dataset vorher zu leeren.
    @Leonalter:: DataSet.WriteXML schreibt eine neue Datei. Wenn das lokal bei Dir nicht so sein sollte, kannst Du ja die Datei vorher vom Programm löschen lassen.
    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!

    "ErfinderDesRades" schrieb:

    Sorry - ich sehe das nicht - woran kann man das erkennen?

    Der Punkt "Settings" soll nur einmal in der Datei vorkommen.

    "ErfinderDesRades" schrieb:

    Viel häufiger ist der Fall, dass beim Einlesen vergessen wird, das Dataset vorher zu leeren.
    Zum Seitenanfang

    Guter Hinweis, das werde ich mal überprüfen.

    "RodFromGermany" schrieb:

    schreibt eine neue Datei

    Da ist die Frage, überschreibt er wirklich die Datei auch? Hab leider keine Möglichkeit gefunden um das dem Programm zu sagen (Beispiel My.Computer.Filesystem.WriteallText, da kann man das in einem Boolean festhalten.)

    Leonalter schrieb:

    Da ist die Frage, überschreibt er wirklich die Datei auch?
    ich verwende das andauernd, und es überschreibt die Datei.

    zeichma Code, vlt. verwendest du das ja eigentümlich kombiniert mit einem TextWriter - da könntemans auch hin-daddeln, dasses die Datei immer verlängert.

    (wir sind aber auch blöd, erst jetzt nach Code zu fragen: Meistens liegts am Code, wenn ein Proggi nicht funzt ;) )
    :rolleyes: Code wäre wirklich keite Schlechte Idee :D

    Hier ist das Form Close Event des Einstellungsfensters. Dort werden nun die Einstellungen gespeichert.

    VB.NET-Quellcode

    1. Private Sub Einstellungen_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    2. If close_save = True Then
    3. If CheckBox1.Checked = True Then
    4. Übersicht.ProjectDataSet1.settings.Item(0).tray = True
    5. Else
    6. Übersicht.ProjectDataSet1.settings.Item(0).tray = False
    7. End If
    8. If CheckBox2.Checked = True Then
    9. Übersicht.ProjectDataSet1.settings.Item(0).autoupates = True
    10. Else
    11. Übersicht.ProjectDataSet1.settings.Item(0).autoupates = False
    12. End If
    13. If CheckBox3.Checked = True Then
    14. Übersicht.ProjectDataSet1.settings.Item(0).loadprojectauto = True
    15. Else
    16. Übersicht.ProjectDataSet1.settings.Item(0).loadprojectauto = False
    17. End If
    18. If CheckBox4.Checked = True Then
    19. Übersicht.ProjectDataSet1.settings.Item(0).audio = True
    20. Else
    21. Übersicht.ProjectDataSet1.settings.Item(0).audio = False
    22. End If
    23. If RadioButton1.Checked = True Then
    24. Übersicht.ProjectDataSet1.settings.Item(0).channels = "4"
    25. ElseIf RadioButton2.Checked Then
    26. Übersicht.ProjectDataSet1.settings.Item(0).channels = "8"
    27. Else
    28. Übersicht.ProjectDataSet1.settings.Item(0).channels = "12"
    29. End If
    30. Übersicht.ProjectDataSet1.settings.Item(0).a = color.A
    31. Übersicht.ProjectDataSet1.settings.Item(0).r = color.R
    32. Übersicht.ProjectDataSet1.settings.Item(0).g = color.G
    33. Übersicht.ProjectDataSet1.settings.Item(0).b = color.B
    34. Übersicht.ProjectDataSet1.settings.WriteXml(My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\Life! Software\VideoMaster\settings.xml")
    35. Form1.refreshcolor()
    36. End If
    btw:

    VB.NET-Quellcode

    1. If CheckBox1.Checked = True Then
    2. Übersicht.ProjectDataSet1.settings.Item(0).tray = True
    3. Else
    4. Übersicht.ProjectDataSet1.settings.Item(0).tray = False
    5. End If
    6. If CheckBox2.Checked = True Then
    7. Übersicht.ProjectDataSet1.settings.Item(0).autoupates = True
    8. Else
    9. Übersicht.ProjectDataSet1.settings.Item(0).autoupates = False
    10. End If
    11. If CheckBox3.Checked = True Then
    12. Übersicht.ProjectDataSet1.settings.Item(0).loadprojectauto = True
    13. Else
    14. Übersicht.ProjectDataSet1.settings.Item(0).loadprojectauto = False
    15. End If
    16. If CheckBox4.Checked = True Then
    17. Übersicht.ProjectDataSet1.settings.Item(0).audio = True
    18. Else
    19. Übersicht.ProjectDataSet1.settings.Item(0).audio = False
    20. End If


    ginge eleganter mit

    VB.NET-Quellcode

    1. Übersicht.ProjectDataSet1.settings.Item(0).tray = CheckBox1.Checked
    2. Übersicht.ProjectDataSet1.settings.Item(0).autoupates = CheckBox2.Checked
    3. Übersicht.ProjectDataSet1.settings.Item(0).loadprojectauto = CheckBox3.Checked
    4. Übersicht.ProjectDataSet1.settings.Item(0).audio = CheckBox4.Checked


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Wie ist

    Leonalter schrieb:

    VB.NET-Quellcode

    1. Übersicht
    deklariert?
    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!
    @fichz
    Vielen Dank, ich fand den Code schon immer grausig. Das ist deutlich besser!

    @RodFromGermany
    Übersicht ist eine andere Windows Form.

    @ErfinderDesRades
    Übersicht = WinForm
    ProjectDataSet1 = DataSet
    settings = Tabelle im DataSet
    WinForm - ist kein Datentyp
    DataSet - ist ein Datentyp, aber nur zufällig. Ist die Basisklasse deines typisierten Dataset
    Tabelle im DataSet - ist kein Datentyp

    Ich glaub, du weißt nicht, was ein Datentyp ist.
    vlt. hilft dir Visual-Studio richtig nutzen, eine Vorstellung davon zu kriegen.



    Leonalter schrieb:

    settings = Tabelle im DataSet
    also machst du DataTable.WriteXml - nicht Dataset.WriteXml!

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

    Ja, mache ich ja.
    Ich habe in dem DataSet nämlich noch die Projektdaten geladen. Diese sollen aber nicht in den Settings gespeichert werden. (Da ist auch das Problem, dass er es anhängt).

    "ErfinderDesRades" schrieb:

    Abgesehen von den anneren Code-Gräuseligkeiten

    Würde mich interessieren was man besser machen kann, um den Code ui optimieren und dazu zu lernen ;)

    Leonalter schrieb:

    Übersicht ist eine andere Windows Form.
    Das hatte ich vermutet, arbeite mit einer Instanz. Gugst Du hier.
    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!
    Wenn man eine neue Versin der Software (neue Anwendungsdatei) verwendet, sind dort nicht mehr die Settings einer älteren Version der Datei vorhanden. Diese werden nicht "übernommen", schließlich ist es ja eine "neue" Anwendung.