Description
I am trying to save and load a DataSet with two DataTables from a file in PowerShell using ReadXml.
I can reference the DataTables in the original DataSet with $dataset.Tables["language"]
or $dataset.Tables["replace"]
, however once loading data from the file the resulting object will not return data when using named references, only $loadedDataSet.Tables[0]
and $loadedDataSet.Tables[1]
.
Is there a reason for this that I am not seeing or is this a limitation or possibly a bug?
Code:
$dataSet = New-Object System.Data.DataSet
$dataSet.DataSetName = "languages"
# Create the language DataTable
$languageDataTable = New-Object System.Data.DataTable
$languageDataTable.TableName = "language"
# Add columns to the language DataTable
$languageDataTable.Columns.Add("value", [string])
$languageDataTable.Columns.Add("name", [string])
# Add rows to the language DataTable
$languageDataTable.Rows.Add("en", "en (English)")
$languageDataTable.Rows.Add("sv", "sv (Swedish)")
# Create the conversion DataTable
$conversionDataTable = New-Object System.Data.DataTable
$conversionDataTable.TableName = "replace"
# Add columns to the conversion DataTable
$conversionDataTable.Columns.Add("from", [string])
$conversionDataTable.Columns.Add("to", [string])
# Add rows to the conversion DataTable
$conversionDataTable.Rows.Add("eng", "en")
$conversionDataTable.Rows.Add("fre", "fr")
#Add DataTables to DataSet
$dataSet.Tables.Add($languageDataTable)
$dataSet.Tables.Add($conversionDataTable)
# Save the DataSet to an XML file
function Save-DataSetToXml {
[System.Data.DataSet]$dataSet,
$dataSet.WriteXml($filePath, [System.Data.XmlWriteMode ]::WriteSchema)
# Load the DataSet from an XML file
function Load-DataSetFromXml {
$ds = New-Object System.Data.DataSet
$ds.ReadXml($filePath, [System.Data.XmlReadMode]::ReadSchema)
# Save the DataSet to an XML file
Save-DataSetToXml -dataSet $dataSet -filePath "data.xml"
# Load the DataSet back from the XML file
$loadedDataSet = Load-DataSetFromXml -filePath "data.xml"
<code>#Create a DataSet
$dataSet = New-Object System.Data.DataSet
$dataSet.DataSetName = "languages"
# Create the language DataTable
$languageDataTable = New-Object System.Data.DataTable
$languageDataTable.TableName = "language"
# Add columns to the language DataTable
$languageDataTable.Columns.Add("value", [string])
$languageDataTable.Columns.Add("name", [string])
# Add rows to the language DataTable
$languageDataTable.Rows.Add("en", "en (English)")
$languageDataTable.Rows.Add("sv", "sv (Swedish)")
# Create the conversion DataTable
$conversionDataTable = New-Object System.Data.DataTable
$conversionDataTable.TableName = "replace"
# Add columns to the conversion DataTable
$conversionDataTable.Columns.Add("from", [string])
$conversionDataTable.Columns.Add("to", [string])
# Add rows to the conversion DataTable
$conversionDataTable.Rows.Add("eng", "en")
$conversionDataTable.Rows.Add("fre", "fr")
#Add DataTables to DataSet
$dataSet.Tables.Add($languageDataTable)
$dataSet.Tables.Add($conversionDataTable)
# Save the DataSet to an XML file
function Save-DataSetToXml {
param (
[System.Data.DataSet]$dataSet,
[string]$filePath
)
$dataSet.WriteXml($filePath, [System.Data.XmlWriteMode ]::WriteSchema)
}
# Load the DataSet from an XML file
function Load-DataSetFromXml {
param (
[string]$filePath
)
$ds = New-Object System.Data.DataSet
$ds.ReadXml($filePath, [System.Data.XmlReadMode]::ReadSchema)
return $ds
}
# Save the DataSet to an XML file
Save-DataSetToXml -dataSet $dataSet -filePath "data.xml"
# Load the DataSet back from the XML file
$loadedDataSet = Load-DataSetFromXml -filePath "data.xml"
</code>
#Create a DataSet
$dataSet = New-Object System.Data.DataSet
$dataSet.DataSetName = "languages"
# Create the language DataTable
$languageDataTable = New-Object System.Data.DataTable
$languageDataTable.TableName = "language"
# Add columns to the language DataTable
$languageDataTable.Columns.Add("value", [string])
$languageDataTable.Columns.Add("name", [string])
# Add rows to the language DataTable
$languageDataTable.Rows.Add("en", "en (English)")
$languageDataTable.Rows.Add("sv", "sv (Swedish)")
# Create the conversion DataTable
$conversionDataTable = New-Object System.Data.DataTable
$conversionDataTable.TableName = "replace"
# Add columns to the conversion DataTable
$conversionDataTable.Columns.Add("from", [string])
$conversionDataTable.Columns.Add("to", [string])
# Add rows to the conversion DataTable
$conversionDataTable.Rows.Add("eng", "en")
$conversionDataTable.Rows.Add("fre", "fr")
#Add DataTables to DataSet
$dataSet.Tables.Add($languageDataTable)
$dataSet.Tables.Add($conversionDataTable)
# Save the DataSet to an XML file
function Save-DataSetToXml {
param (
[System.Data.DataSet]$dataSet,
[string]$filePath
)
$dataSet.WriteXml($filePath, [System.Data.XmlWriteMode ]::WriteSchema)
}
# Load the DataSet from an XML file
function Load-DataSetFromXml {
param (
[string]$filePath
)
$ds = New-Object System.Data.DataSet
$ds.ReadXml($filePath, [System.Data.XmlReadMode]::ReadSchema)
return $ds
}
# Save the DataSet to an XML file
Save-DataSetToXml -dataSet $dataSet -filePath "data.xml"
# Load the DataSet back from the XML file
$loadedDataSet = Load-DataSetFromXml -filePath "data.xml"
Expecations and Results
$dataset.Tables["language"]
results in
<code>value name
----- ----
en en (English)
sv sv (Swedish)
</code>
value name
----- ----
en en (English)
sv sv (Swedish)
$loadedDataSet.Tables["language"]
results in
$loadedDataSet.Tables[0]
results in
<code>value name
----- ----
en en (English)
sv sv (Swedish)
</code>
value name
----- ----
en en (English)
sv sv (Swedish)
I expect them all to return the same output since the objects are identical (at least to my knowledge).
Troubleshooting
I am not sure how to troubleshoot this but I have tried alternating XmlWriteMode and XmlReadMode however it didn’t make any difference.