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

11

因为有巨大的表格,如果要一次性导出所有行数据,可能会出现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);  

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


如果您在代码行 dataTable.Load(oraReaderTableData); 上设置了断点,您能否查看数据是否已正确加载到 dataTable 中? - Hugo Nava Kopp
是的,有行。 - Nime Cloud
1
在加载读取器后,您是否尝试为dataTable的TableName属性设置一个值? - Hugo Nava Kopp
添加 dataTable.TableName = "test"; 解决了这个问题。 - Nime Cloud
2个回答

24
根据异常提示,该表没有设置其TableName属性。所以你只需要将其设置即可。
DataTable dataTable = new DataTable { TableName = "MyTableName"};
dataTable.Load(oraReaderTableData);
....

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

Sample Code

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接