Comment faire pour exporter une Table de données Xml avec TOUTES les colonnes d'attributs?
Question: je suis de l'exportation d'un Système.Les données.DataTable à XML.
Jusqu'à présent, il fonctionne très bien.
Mais je veux avoir toutes les données dans les attributs, qui fonctionne très bien ainsi.
Mais mon problème maintenant, si dans une colonne, toutes les lignes sont NULLES, pas de vide attributs sont écrits.
Donc si j'ai lu le XML retour à une DataTable, il manque de cette colonne...
Comment puis-je la force d'écrire toutes les colonnes, même lorsqu'ils sont vides ?
(DataType pas nécessairement string)
public void ExportTable(string strDirectory, DataTable dtt)
{
using (System.Data.DataSet ds = new System.Data.DataSet()) {
string strTable = dtt.TableName;
ds.Tables.Add(dtt);
ds.DataSetName = strTable;
//Move data to attributes
foreach (DataTable dt in ds.Tables) {
foreach (DataColumn dc in dt.Columns) {
dc.ColumnMapping = MappingType.Attribute;
}
}
System.Xml.XmlWriterSettings settings = new System.Xml.XmlWriterSettings();
settings.Indent = true;
//settings.Encoding = System.Text.Encoding.GetEncoding("ISO-8859-1")
settings.Encoding = System.Text.Encoding.UTF8;
settings.CloseOutput = true;
settings.CheckCharacters = true;
settings.NewLineChars = "\r\n";
//vbCr & vbLf
//Write as UTF-8 with indentation
using (System.Xml.XmlWriter w = System.Xml.XmlWriter.Create(System.IO.Path.Combine(strDirectory, strTable + ".xml"), settings)) {
//Strip out timezone
foreach (DataTable dt in ds.Tables) {
foreach (DataColumn dc in dt.Columns) {
if (object.ReferenceEquals(dc.DataType, typeof(DateTime))) {
dc.DateTimeMode = DataSetDateTime.Unspecified;
}
}
}
ds.Tables[0].WriteXml(w, XmlWriteMode.IgnoreSchema);
w.Flush();
w.Close();
}
//w
}
//ds
}
//ExportTable
VB.NET original:
Public Sub ExportTable(strDirectory As String, dtt As DataTable)
Using ds As New System.Data.DataSet()
Dim strTable As String = dtt.TableName
ds.Tables.Add(dtt)
ds.DataSetName = strTable
' Move data to attributes
For Each dt As DataTable In ds.Tables
For Each dc As DataColumn In dt.Columns
dc.ColumnMapping = MappingType.Attribute
Next dc
Next dt
Dim settings As New System.Xml.XmlWriterSettings()
settings.Indent = True
'settings.Encoding = System.Text.Encoding.GetEncoding("ISO-8859-1")
settings.Encoding = System.Text.Encoding.UTF8
settings.CloseOutput = True
settings.CheckCharacters = True
settings.NewLineChars = vbCrLf ' vbCr & vbLf
' Write as UTF-8 with indentation
Using w As System.Xml.XmlWriter = System.Xml.XmlWriter.Create(System.IO.Path.Combine(strDirectory, strTable & ".xml"), settings)
' Strip out timezone
For Each dt As DataTable In ds.Tables
For Each dc As DataColumn In dt.Columns
If dc.DataType Is GetType(DateTime) Then
dc.DateTimeMode = DataSetDateTime.Unspecified
End If
Next dc
Next dt
ds.Tables(0).WriteXml(w, XmlWriteMode.IgnoreSchema)
w.Flush()
w.Close()
End Using ' w
End Using ' ds
End Sub ' ExportTable
Utilisation XmlWriteMode.WriteSchema. Avec un schéma fourni, il n'a pas d'importance qu'il n'a pas à ajouter des attributs pour les valeurs null.
Sans schéma serait plus agréable, parce que le résultat doit être facile à lire dans tout langage de programmation, et pas seulement .NET.
Sans schéma serait plus agréable, parce que le résultat doit être facile à lire dans tout langage de programmation, et pas seulement .NET.
OriginalL'auteur Stefan Steiger | 2012-04-19
Vous devez vous connecter pour publier un commentaire.
Chaque attribut XML doit être affectée une valeur qui est enfermé dans une paire de guillemets simples ou doubles. Il n'y a pas d'équivalent en texte brut pour désigner une valeur NULL. Une paire de guillemets avec aucune valeur pour représenter une chaîne vide n'est pas le même comme une valeur NULL. Par conséquent, le seul moyen de représenter une valeur NULL attribut est d'omettre l'attribut.
Cela signifie que vous aurez besoin soit de définir
AllowDBNull
de faux et d'attribuer un adaptéDefaultValue
sur le DataColumn, ou inclure le schéma.Aussi, voir La manipulation des Valeurs Null (ADO.NET)., en particulier cette section, qui explique le comportement:
OriginalL'auteur JamieSee
Essayer le réglage de la colonne de DefaultValue à quelque chose de valable
OriginalL'auteur Anurag Ranjhan
Deux points:
Première:
Le ExportTable() a lancé une exception: "DataTable appartient déjà à un autre ensemble de données." Quand j'ai exécuté:
J'ai corrigé cela en faisant une copie locale de la table:
Cela a bien fonctionné.
Deuxième:
Si vous utiliser le XML pour créer une instruction SQL dynamique, il n'est pas besoin d'être préoccupé par les colonnes/champs avec la valeur NULL être omis dans l'export XML. Il suffit de marcher à travers l'un des attributs qui sont dans le fichier XML du dossier, construire l'instruction INSERT ou UPDATE et exécuter une commande de connexion. C'est plus rapide que d'utiliser un DataSet.
Pour INSÉRER il a un inconvénient. Si la clé primaire est créé par incrémentation d'une colonne d'identité, un ADO.Net jeu de données sera de retour. SQL dynamique nécessitera une instruction SELECT pour récupérer.
Aussi, ce serait une bonne idée de dissimuler votre code.
OriginalL'auteur Jakester26
C'est un peu vieux thread mais, peut-être que ça peut aider quelqu'un:
Si vous n'êtes pas de l'écriture de gros fichiers xml fréquemment (c'est ok pour l'exportation de paramètres ou quelque chose de similaire), vous pouvez utiliser la fonction ci-dessous, sinon il est préférable d'utiliser cutom schéma xml.
Utilisation:
OriginalL'auteur Circus Ranger
J'ai été la recherche de tout le monde pour une solution de l'écriture des champs null XML en utilisant un jeu de données.WriteXML(). J'ai trouvé que suite à des travaux dans une performance optimisée. J'ai créé une fonction pour votre commodité. Changer votre jeu de données les tables les unes après les autres en appelant la fonction suivante et remplacer les tables.
OriginalL'auteur Rajarshi