将 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();
}
如果 XmlWriteMode
是 WriteSchema
,则创建 xml 文件并用模式填充,仍然会抛出异常。如果 XmlWriteMode
是 IgnoreSchema
并且创建了空文件并抛出异常。
是什么导致了这个问题?我在这里和网络上的其他地方搜索了大量帖子,每个人都说 "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;
}
}
}
}
我正在尝试将 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();
}
如果 XmlWriteMode
是 WriteSchema
,则创建 xml 文件并用模式填充,仍然会抛出异常。如果 XmlWriteMode
是 IgnoreSchema
并且创建了空文件并抛出异常。
是什么导致了这个问题?我在这里和网络上的其他地方搜索了大量帖子,每个人都说 "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;
}
}
}
}