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

我需要将所有数据表导出到单个XML文件,并且由于System.OutOfMemoryException(如果有一个巨大的表),我无法一次性导出所有行。 所以我试图导出N行。 但是,如果我在查询中使用分页语法,则WriteXml会抛出exception。

我在LINQPad中测试了两个查询,它们没问题。

System.InvalidOperationException:无法序列化DataTable。 未设置DataTable名称。

// The first query causes exception string oraQueryGetTableData = "SELECT * FROM (SELECT t0.* FROM MY_TABLE t0) WHERE ROWNUM <= 100"; // The second query runs without any error //oraQueryGetTableData = "SELECT * FROM MY_TABLE"; OracleCommand oraCommandGetTableData = new OracleCommand(oraQueryGetTableData, oraConnection); OracleDataReader oraReaderTableData = oraCommandGetTableData.ExecuteReader(); DataTable dataTable = new DataTable(); dataTable.Load(oraReaderTableData); // Exception might occur here dataTable.WriteXml(writer, true); 

这里有什么问题或我该如何解决这个问题?

正如例外所述 – 表没有设置TableName属性。 所以你只需要设置它。

 DataTable dataTable = new DataTable { TableName = "MyTableName"}; dataTable.Load(oraReaderTableData); .... 

如果使用Newtonsoft将JSON字符串数据反序列Newtonsoft DataTable ,则不会设置TableName属性。 我编写了示例代码并在dt赋值后放置了断点,让你看到什么是dt.TableName 。 调试结果如下:

示例代码

因此,如果您希望作为Web服务方法的结果返回DataTable ,则在DeserializeObject之后需要TableName属性赋值。 我将代码更改为:

 DataTable dt = JsonConvert.DeserializeObject( @"[ { col1: 'value1', col2: 'value2' }, { col1: 'value3', col2: 'value4' }, { col1: 'value5', col2: 'value6' }, ]"); dt.TableName = "TableName"; 

然后我再次调试它。 这是Web方法可以返回的首选DataTable

示例代码2