Aktualisierung Dataset

  • VB.NET

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

    Madde schrieb:

    Was kann ich einbauen, dass während die eine Instanz Änderungen vornimmt, die andere dies gemeldet bekommt und keine Änderungen vornehmen kann, bis die XML nicht mehr in Verwendung ist.
    Das geht jetzt stark in Richtung Datenbänkerei, Stichwort "Pessimistic Locking".

    Naja, wenn das mit dem FileSystemWatcher funzt, dann musste in einen irgendwie gearteten "EditModus" gehen, und das auch iwie ins Dataset schreiben, und abspeichern.
    Der andere reloaded dann ja wg FSW, und kann nachsehen, dass dieses Dataset momentan gesperrt ist.

    Unerfreulich wirds, wenn ersterer User dann nach Hause geht, ohne das Dataset zu entsperren.
    Das mit dem Dateilock ist an sich schnell gemacht:

    VB.NET-Quellcode

    1. Dim StreamReader = IO.File.OpenText(Dateipfad)
    2. 'ab jetzt ist die Datei quasi offen und für Schreibarbeiten durch andere Programme oder Methoden gesperrt.
    3. Dim InhaltDerDatei = StreamReader.ReadToEnd()
    4. 'und später zum Freigeben:
    5. StreamReader.Dispose()
    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.
    das ist jetzt aber ein "Optimistic Lock".
    "Optimistic Lock" bedeutet: Es gibt keine Zugriffs-Beschränkung, sondern man hofft darauf, dass keine gleichzeitigen EditVorgänge auftreten - das ist der "Optimismus" daran.
    Tritt das Übel aber dennoch ein, so gibts eine Exception.
    Jo, und genau das wird mit dem Dateilock nach post#42 passieren.

    Aber @Madde wollte glaub genau das mit seiner Frage in Post #40 vermeiden.
    @ErfinderDesRades
    Wenn ich die Exception mit einer Meldung abfangen kann, ist das völlig in Ordnung.
    Das würde für diese Zwecke vollkommen ausreichen.

    Edit:
    Dim StreamReader = IO.File.OpenText(Dateipfad) bricht den Debug ab.
    System.InvalidCastException: "Ungültige Konvertierung von der Zeichenfolge daten.xml in Typ Integer."

    @VaporiZed
    Was ist in Dim InhaltDerDatei = StreamReader.ReadToEnd() mit InhaltDerDatei gemeint?

    Grüße

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

    na, denn hast du in post#42 ja den Ansatz zur Lösung deines Probs gefunden.

    achso - edit.
    Die Zeile die du nennst kann eiglich nicht die Fehlerzeile sein.
    Und mit InhaltDerDatei ist vermutlich der Inhalt der Datei gemeint.
    (Sorry, vlt. kann jemand anners das besser erklären.)

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

    Ein Wort sagt mehr als tausend Bilder.
    Bilder
    • OpenWithStreamReader.png

      29,52 kB, 966×324, 45 mal angesehen
    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.

    VaporiZed schrieb:

    Ein Wort sagt mehr als tausend Bilder.


    Ok, zunächst mal zum Verständnis. Da es sich um eine XML mit unzähligen Einträgen handelt, wird diese Art wohl nicht anwendbar sein oder verstehe ich es nur falsch?
    In diesem Zusammenhang wäre es sicher auch möglich eine TXT anzulegen und bei Verwendung einfach "Bearbeitung" reinzuschreiben und bei Verlassen den Inhalt wieder zu löschen. Die andere Instanz schaut dann rein und an Hand des Eintrages oder eben dem "Nichts" kann sie dann weitermachen oder eben nicht.
    Leider bei mir alles nur Theorie, da ich aus Mangel von Kenntnissen den Code nicht verfassen kann und hier auf Eure Hilfe angewiesen bin.

    Unabhängig davon bekomme ich eben diesen Fehler aus Post#44

    Grüße

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

    Madde schrieb:

    In diesem Zusammenhang wäre es sicher auch möglich eine TXT anzulegen und bei Verwendung einfach "Bearbeitung" reinzuschreiben und bei Verlassen den Inhalt wieder zu löschen. Die andere Instanz...
    Find ich eiglich eine gute Idee.
    Per FSW hätte man dann ja einen Benachrichtigungs-Mechanismus.
    Also der FSW überwacht nu nicht die (riesige) Daten-xml, sondern nur die kleine Zusatz-Datei.

    Nur ich hab ATM nicht die Zeit dir das zu coden.

    VB.NET-Quellcode

    1. ' --- Datei öffnen
    2. Dim fs As FileStream = New FileStream(Application.StartupPath("edit.txt"), FileMode.OpenOrCreate, FileAccess.Write)
    3. Dim w As StreamWriter = New StreamWriter(fs)
    4. ' --- Text schreiben
    5. w.WriteLine("Bearbeitung")


    Ich bekomme aber noch immer einen Fehler beim Debug.
    Ungültige Konvertierung von der Zeichenfolge edit.txt in Typ Integer

    Woran könnte das liegen?
    Du vergleichst jetzt aber Äpfel mit Glühbirnen. Das hat ja nix mit meinem Vorschlag zu tun.
    Application.StartupPath ist ein String, keine Methode. Und wenn man EinString(wasauchimmer) schreibt, versucht der Compiler dieses wasauchimmer als Zahl zu interpretieren, um das xte Zeichen + 1 wiederzugeben. Also "Test"(0) gibt T wieder, "Test"(2) ergibt s. Da aber "edit.txt" nicht als Zahl interpretiert werden kann, meckert der Compiler.
    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.
    Ja, ich weiß, Option Strict sollte auf On stehen. Ich will da auch nicht als unbelehrbar wirken aber ich hatte am Anfang eine Sache drin, die sich einfach nicht umsetzen ließ ohne das er gemeckert hat. Naja und auf Off gestellt lief es halt. Da wollte ich einfach weiter vorankommen. Aus Programmierersicht vlt die falsche Einstellung, ist mir auch klar.

    Nun noch mal zu meinem Thema, ich habe es hinbekommen, nicht ganz wie @ErfinderDesRades es vlt meinte aber für meine Zwecke ausreichend.

    VB.NET-Quellcode

    1. ' die edit.txt wird auf den Eintrag "Bearbeitung" überprüft
    2. Dim txt As String = System.IO.File.ReadAllText(_Edit.FullName)
    3. If txt.Contains("Bearbeitung") Then
    4. MsgBox("Es wird im Moment ein Auftrag eingetragen. Bitte kurz warten und dann neu versuchen.", MsgBoxStyle.Information, "Bitte noch einmal versuchen")
    5. Return
    6. End If


    VB.NET-Quellcode

    1. ' Text "Bearbeitung" in die edit.txt eintragen
    2. IO.File.WriteAllText(_Edit.FullName, "Bearbeitung")


    VB.NET-Quellcode

    1. ' Löschen des Inhalts der edit.txt
    2. IO.File.WriteAllText(_Edit.FullName, Nothing)


    Die Tests waren bislang erfolgreich.

    Grüße
    Und dann noch den VB6-Namespace drin. Du willst aber auch provozieren, oder? :P
    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.
    In diesem speziellen Code das mit MsgBox. Aber das steht alles in dem Thread drin, den EdR in Post#52 verlinkt hat.
    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.