Dataset enthält mehrere Datatable aber es werden mit XMLWrite nicht alle gespeichert

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von chrisna.

    Dataset enthält mehrere Datatable aber es werden mit XMLWrite nicht alle gespeichert

    Hallo Leute,

    ich hab da i.M. ein Problem und kann keine Lösung dazu finden.

    Ich habe ein Dataset mit mehreren Datatable direkt im Code erstellt:

    VB.NET-Quellcode

    1. Public SWDS As New DataSet("SwDS")
    2. Public SWTB As New DataTable("ArtikelTB")
    3. Public SWAUTB As New DataTable("AuTB")
    4. Public SWBBTB As New DataTable("BbTB")

    die Tabellen sind auch an das Dataset gebunden:

    VB.NET-Quellcode

    1. SWDS.Tables.Add(SWTB)
    2. SWDS.Tables.Add(SWAUTB)
    3. SWDS.Tables.Add(SWBBTB)

    Die Bearbeitung der Tabellen funktioniert auch soweit (es besteht keine Beziehung zwischen den Tabellen). Ich möchte sämtliche Tabellen in einer Datei speichern. Das scheint zunächst zu funktionieren:

    VB.NET-Quellcode

    1. SWDS.WriteXml(SaveFileDialog1.FileName)

    Beim Zurückschreiben fällt aber auf, dass der Inhalt einer Tabelle fehlt.
    Wenn ich das XML-File im Editor ansehe, dann fehlt dort eine Tabelle komplett.
    Wenn ich mir die Datenstruktur mittels Direktfenster zur Laufzeit ansehe, dann sind alle Tabellen und die Anbindung ans Dataset (swds.Tables.Count -> 3) und auch die Inhalte da.

    Was muß ich tun, um alle Tabellen zu speichern? ?(

    Gruß
    Chris
    Wenn ich mich nicht irre, musst Du die Tabellen eines DataSets einzeln speichern.
    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!
    Eigentlich nicht.
    Ich musste es zumindest nie bei typisierten Datasets.
    Da wurde das komplette DataSet mit allen Tabellen in die XML Datei geschrieben.
    Gibt es einen Grund, dass du die Datatables erst zur Laufzeit an das Dataset hängst?
    Das ist meine Signatur und sie wird wunderbar sein!
    Hi,

    ich hänge die Datatables erst zur Laufzeit an das Dataset, da ich diese auch erst zur Laufzeit erstelle. Und Daten sind natürlich auch vorhanden. Ich erstelle von den Tabellen ein DataView und hänge dies an jeweils ein Datagridview. Ich finds halt komisch, dass zwei Tabellen gespeichert werden und die dritte nicht. Ich meine alles gleich gemacht zu haben aber irgendwo steckt ja wohl ein Fehler drin.

    Macht es einen Unterschied, ob ich die Dataset/Datatable mit dem Designer erstelle?

    chrisna schrieb:

    Macht es einen Unterschied, ob ich die Dataset/Datatable mit dem Designer erstelle?

    Nadürlich:
    Es geht deutlich einfacher und dürfte deutlich weniger fehleranfällich sein. Zudem stehen dir die Daten typisiert zur Verfügung. Du mußt dich also nicht um Datentypumwandlungen kümmern. Die datenbindung läuft einfach, indem du die Tabelle ausm Datenquellenfenster auf die Form zerrst.
    Und der Designer weis besser was er tun tut als meinereinerseiner oder vielleicht deinereinerunser.

    Und wie gesagt, prüfe mal direkt vor dem Speichern, ob was in deiner Datatable drinsteht (mit Debug.Print o.ä.). Kann auch sein, dass die dein Bindingdings noch mit EndEdit und Validate und so die Editiererei beenden muß.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:

    chrisna schrieb:

    ich hänge die Datatables erst zur Laufzeit an das Dataset, da ich diese auch erst zur Laufzeit erstelle.

    Du könntest höchstens ein Textprojekt erstellen und anhängen - weil ich bin zu faul, den Fehler zu reproduzieren. Von meinem Verständnis her müsste das mit dynamisch erzeugten DataTables ebenso funzen wie mit designergenerierten.
    Aber da ich (wir) nicht mit sowas arbeite(n), kannichnix sicher dazu sagen.
    Hallo zusammen!
    Ich glaube, ich bin schon ziemlich nahe an der Lösung aber eben noch nicht ganz.

    Zunächst hab ich mal den Tipp von xtts02 ausprobiert:
    Versuchsweise auch das Schema mitspeichern (Überladung von WriteXml). Danach prüfen, ob die Information zu fehlender DataTable vorhanden ist.

    Dabei konnte ich feststellen, dass die Definition der "fehlenden" Tabelle mitgespeichert wird aber keine Inhalte, obwohl doch welche in dem zugehörigen Datagridview zu sehen sind. Ich hab dann überprüft, ob denn Daten in der Dataview und in der Tabelle sind. Beides positv, d.h. die richtige Anzahl an Zeilen ist vorhanden und auch stickprobenartig herausgesuchte Daten sind da. Mir ist dann aber aufgefallen, das die Bindung der Tabelle zum Dataset verloren gegangen scheint (? Tabelle.DataSet ergibt nothing).

    Die Ursaache dafür sehe ich darin, dass ich während der Bearbeitung der Tabelle die Funktion "Tabelle.Clear()" verwendet habe. Ich habe dann zwar die Bindungen an Dataview und an das Datagrid wieder hergestellt aber eben nicht an das Dataset. Tja, nix einfacher als das, habe ich gedacht. Einfach die Bindung ans Dataset "DataSet.Tables.Add(Tabelle)" nochmal machen und gut ist. Ist aber nicht, es kommt die Fehlermeldung "Die DataTable gehört bereits zu diesem DataSet."

    Jetzt brauch ich nochmal eure Hilfe. Wie kann ich also die Bindung zw. DataSet und Tabelle so löschen, dass ich sie wieder herstellen kann. Oder aber, ich muß anstelle der Funktion "Tabelle.Clear()" etwas anderes benutzen. Das Ziel ist einfach nur die Daten aus der Tabelle komplett zu löschen. Die Tabelle wird dann durch Kopieren einer anderen Tabelle wieder mit Daten gefüllt.

    Habt ihr ma 'nen Tipp für mich?

    Gruß
    Chris
    Nochmal hallo!

    Ich hab's, das Problem ist gelöst!!! :thumbsup: :thumbsup: :thumbsup:
    Das Problem war, dass ich eigentlich nur den Inhalt einer Tabelle löschen wollte. Das habe ich mit "Tabelle.Clear()" versucht. Die Daten werden auch gelöscht, darüberhinaus aber scheinbar auch die Bindungen. Die Funktion die funktioniert ist: "Tabelle.Rows.Clear()", hier werden nur die Inhalte gelöscht. Das war aber noch nicht die ganze Lösung ;( . Ich habe die Daten aus einer anderen Tabelle mit identischer Struktur zurückkopiert "Tabelle1 = Tabelle2.Copy". Die Inhalte waren auch wieder da aber die Bindung war schon wieder weg :cursing: . Die endgültige Lösung war dann statt des Copy-Befehls die Merge-Funktion zu nehmen: "Tabelle1.Merge(Tabelle2) ^^ ^^ ^^

    Danke für eure Unterstützung

    Gruß
    Chris