4

J'essaie d'enregistrer et de charger un DataTable dans PowerShell. je l'enregistre comme ceci:Chargement d'un DataTable sérialisé dans PowerShell - Donne un tableau de DataRows non un DataTable

$dt | Export-CliXml -path "c:\exports\data.xml" 

et le charger comme ceci:

$dt = Import-CliXml -path "c:\exports\data.xml" 

Mais le type je rentrerai est un tableau de lignes plutôt que d'un DataTable! Cela me pose des problèmes majeurs car il doit être passé dans une fonction qui nécessite un DataTable, et il ne peut pas être converti en un.

Toute aide grandement appréciée, merci.

Répondre

4

Ceci est un trap connu: PowerShell traite votre DataTable comme une collection de DataRow éléments. C'est la toute première commande

$dt | Export-CliXml -path "c:\exports\data.xml" 

déjà "oublie" la table de données. Vous pouvez jeter un oeil au fichier de sortie, il commence par DataRow:

<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04"> 
    <Obj RefId="0"> 
    <TN RefId="0"> 
     <T>System.Data.DataRow</T> 

Pour éviter cet effet, utilisez l'opérateur , (il semble drôle, mais c'est exactement comment cela fonctionne):

, $dt | Export-CliXml -path "c:\exports\data.xml" 

par conséquent, le fichier de sortie commence maintenant avec DataTable:

<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04"> 
    <Obj RefId="0"> 
    <TN RefId="0"> 
     <T>System.Data.DataTable</T> 

Après cela, vous pouvez importer la table arrière:

$dt = Import-CliXml -path "c:\exports\data.xml" 

Vérifions-le:

$dt | Get-Member 
# output: 
TypeName: Deserialized.System.Data.DataRow 
… 

On peut voir le même effet (DataRow au lieu de DataTable). Ainsi, la commande est correcte avec ,:

, $dt | Get-Member 
# output: 
TypeName: Deserialized.System.Data.DataTable 
… 

Alors, nous déshydratons vraiment un DataTable de cette façon.

===

EDIT: Cet effet est connu sous le nom déroulant. PowerShell a tendance à dérouler les collections. L'opérateur virgule crée un tableau d'un seul élément. PowerShell déroule également ce tableau, mais il ne déroule pas ses éléments (notre DataTable).

Voici une question similaire:

Strange behavior in PowerShell function returning DataSet/DataTable

+0

Merci, mais cela me laisse encore un problème: $ dt2 = (Import-clixml de « c: \ exportations \ data.xml ") $ dt2.GetType(). Nom Objet [] $ dt2 | Get-Member TypeNom: Deserialized.System.Data.DataTable – Chris

+0

Quel est le problème? (BTW, vous faites quelque chose de différent que je l'ai suggéré). –

+0

Si je sauve la table de la façon dont vous dites, puis importer avec: $ dt = Import-clixml -path "c: \ exportations \ data.xml" dt.GetType() $ donne l'erreur: "Invocation de méthode a échoué car [Deserialized.System.Data.DataTable] ne contient pas une méthode nommée 'GetType'" Lorsque je passe $ dt dans ma fonction qui nécessite un DataTable, je reçois: Impossible de convertir le "système .Collections.ArrayList "valeur de type" System.Collections.ArrayList "pour taper" System .Data.DataTable ". – Chris

Questions connexes