Frage: Ich exportiere eine System.Data.DataTable nach XML. Bis jetzt funktioniert es gut. Aber ich möchte alle Daten in Attributen haben, was auch gut funktioniert. Aber mein Problem jetzt, wenn in einer Spalte alle Zeilen NULL sind, werden keine leeren Attribute geschrieben. Also wenn ich das XML zurück zu einer DataTable lese, fehlt es dieser Spalte ...
Wie kann ich zwingen, alle Spalten zu schreiben, auch wenn sie leer sind?
(DataType nicht unbedingt String)
VB.NET Original:
%Vor%Jedem XML-Attribut muss ein Wert zugewiesen werden, der in ein Paar einfacher oder doppelter Anführungszeichen eingeschlossen ist. Es gibt kein Äquivalent im Klartext, um einen NULL-Wert zu bezeichnen. Ein Anführungszeichen ohne Wert, das eine leere Zeichenfolge darstellt, ist nicht mit einem NULL-Wert identisch. Daher besteht die einzige Möglichkeit, ein NULL-Attribut darzustellen, darin, das Attribut wegzulassen.
Dies bedeutet, dass Sie AllowDBNull
auf "false" setzen und der DataColumn ein passendes DefaultValue
zuweisen oder das Schema einschließen müssen.
Siehe auch Umgang mit Nullwerten (ADO.NET). , insbesondere in diesem Abschnitt erklärt das Verhalten:
Zusätzlich gelten die folgenden Regeln für eine Instanz von DataRow. ["ColumnName"] Nullzuweisungen:
1.Der Standard-Standardwert ist DbNull.Value für alle außer den stark typisierten Null-Spalten, in denen er stark typisiert ist Nullwert.
2. Nullwerte werden niemals während der Serialisierung in XML-Dateien ausgegeben (wie in "xsi: nil").
3.Alle Nicht-Null-Werte, einschließlich der Standardwerte, werden beim Serialisieren in XML immer ausgeschrieben. Dies ist im Gegensatz zur XSD / XML-Semantik, wo a Nullwert (xsi: nil) ist explizit und der Standardwert ist implizit (if Da es in XML nicht vorhanden ist, kann ein validierender Parser es von einem zugeordneten abrufen XSD-Schema). Das Gegenteil gilt für eine DataTable: ein Nullwert ist implizit und der Standardwert ist explizit.
4. Alle fehlenden Spaltenwerte für Zeilen, die aus der XML-Eingabe gelesen werden, erhalten NULL. Zeilen, die mit NewRow oder ähnlichen Methoden erstellt wurden, erhalten die DataColumns Standardwert.
5.Die IsNull-Methode gibt sowohl für DbNull.Value als auch für INullable.Null den Wert true zurück.
Versuchen Sie, die Spalte DefaultValue auf etwas Gültiges zu setzen
%Vor%Zwei Punkte:
Erstens: Die ExportTable () hat eine Ausnahme ausgelöst: "DataTable gehört bereits zu einem anderen DataSet." Als ich ausgeführt habe:
%Vor%Ich habe das korrigiert, indem ich eine lokale Kopie der Tabelle gemacht habe:
%Vor%Das hat gut funktioniert.
Zweitens: Wenn Sie den XML-Code zum Erstellen einer dynamischen SQL-Anweisung verwenden, müssen Sie sich keine Gedanken darüber machen, dass die Spalten / Felder mit dem NULL-Wert beim XML-Export weggelassen werden. Gehen Sie einfach durch die a-Attribute im XML-Datensatz, erstellen Sie die INSERT- oder UPDATE-Anweisung und führen Sie einen Verbindungsbefehl aus. Dies ist schneller als mit einem DataSet.
Für INSERT hat es einen Nachteil. Wenn der Primärschlüssel durch Inkrementieren einer Identitätsspalte erstellt wird, gibt ein ADO.Net DataSet diesen zurück. Dynamisches SQL erfordert eine SELECT-Anweisung, um es abzurufen.
Es wäre auch eine gute Idee, Ihren Code zu verschleiern.
Es ist ein bisschen alt, aber vielleicht kann es jemandem helfen:
Wenn Sie keine großen XML-Dateien häufig schreiben (es ist ok für den Export von Einstellungen oder etwas ähnliches), können Sie die Funktion unten verwenden, andernfalls ist es besser, das Cutom-XML-Schema zu verwenden.
Verwendung:
%Vor%Ich habe die ganze Welt nach einer Lösung für das Schreiben von Nullfeldern in XML mit DataSet.WriteXML () gesucht. Ich fand, dass das Folgen auf eine leistungsoptimierte Weise funktioniert. Ich habe eine Funktion für Ihre Bequemlichkeit erstellt. Ändern Sie Ihre Dataset-Tabellen nacheinander, indem Sie die folgende Funktion aufrufen und die Tabellen ersetzen.
%Vor%