将DataSet序列化为XML时出错

时间:2016-03-02 08:21:46

标签: c# xml serialization dataset xml-serialization

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

  

无法序列化DataTable。未设置DataTable名称。

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

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

无法序列化DataTable。未设置DataTable名称。

以下是我用于序列化数据集的代码:

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

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

是什么导致了这个问题?我在这里和网上的其他地方搜集过大量的帖子,每个人都说“设置表名”。我做到了这一点,但没有任何区别。

2 个答案:

答案 0 :(得分:1)

根据评论,问题是由于数据集中的某些表没有给出名称。它可能是次要表(Table1,Table2等中的表元素)。

解决方案可以通过数据集中的所有对象迭代,如果type为DataTable,则设置通用名称。

答案 1 :(得分:0)

这是我使用的解决方案,它的工作原理。 可能不是最有效的,但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;
                }
            }
        }
    }