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

时间:2016-02-10 11:53:44

标签: c# sql oracle datatable

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

我在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);  

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

2 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:0)

如果您使用Newtonsoft将JSON字符串数据反序列化为DataTable,则TableName属性将 NOT 设置。我编写了示例代码,并在dt分配后设置了断点,以便让您看到dt.TableName是什么。调试结果如下所示:

Sample Code

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

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

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

Sample Code 2