将 DataSet 序列化为 XML 时出错

Error serializing DataSet to XML

我正在尝试将 DataSet 序列化为 XML 文件。 从示例输出中可以看出,我的所有表都有名称,数据集也有名称。数据集命名空间为“”,更改它没有任何效果。 被捕获的异常是:

Cannot serialize the DataTable. DataTable name is not set.

正如您在下面可以清楚地看到的,所有表都已命名。

DataSet Name: TestDataSet
Table:        TABLE1
Table:        TABLE2
Table:        TABLE3
Table:        TABLE4
Table:        TABLE5

Cannot serialize the DataTable. DataTable name is not set.

这是我用来序列化数据集的代码:

using (FileStream stream = new FileStream("db.xml", FileMode.Create))
{
    dataSet.WriteXml(stream, XmlWriteMode.WriteSchema);
    stream.Close();
}

如果 XmlWriteModeWriteSchema,则创建 xml 文件并用模式填充,仍然会抛出异常。如果 XmlWriteModeIgnoreSchema 并且创建了空文件并抛出异常。

是什么导致了这个问题?我在这里和网络上的其他地方搜索了大量帖子,每个人都说 "set the table name"。我已经这样做了,但没有任何区别。

根据评论,问题是由于数据集中的某些 table 没有指定名称。它可能是次要的 tables(Table1、Table2 等中的 table 个元素)。

解决方案可以是 迭代 遍历数据集中的所有对象,如果类型是 DataTable,则设置通用名称。

这是我采用的解决方案并且有效。 可能不是最有效的,但 XML 现在已正确序列化。

    private void FixTables(DataTable table)
    {
        foreach (DataRow row in table.Rows)
        {
            foreach (DataColumn column in table.Columns)
            {
                var columnName = column.ColumnName;
                if (column.DataType == typeof(DataTable) && row[columnName] != DBNull.Value)
                {
                    DataTable innerTable = (DataTable)row[columnName];
                    innerTable.TableName = columnName;
                }
            }
        }
    }