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

Posted

技术标签:

【中文标题】无法序列化 DataTable。未设置数据表名称【英文标题】:Cannot serialize the DataTable. DataTable name is not set 【发布时间】:2016-05-20 18:20:34 【问题描述】:

我需要将所有数据表导出到单个 XML 文件中,如果有一个巨大的表,我无法一次导出所有行,因为 System.OutOfMemoryException。所以我尝试导出 N 行。但是,如果我在查询中使用分页语法,WriteXml 会引发异常。

我已经在 LINQPad 中测试了这两个查询,它们都可以。

System.InvalidOperationException:无法序列化 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中了吗? 是的,有行。 你有没有试过在加载阅读器后给dataTable的TableName属性设置一个值? 添加dataTable.TableName = "test";解决了问题。 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于无法序列化 DataTable。未设置数据表名称的主要内容,如果未能解决你的问题,请参考以下文章

JQuery DataTable 不允许使用 colspan(无法设置未定义的属性 '_DT_CellIndex')

DataTable row() 始终未定义,无法从数据库中检索数据

未捕获的类型错误:无法读取 JQuery DataTable 未定义的属性“mData”

jQuery Datatable Uncaught TypeError:无法读取未定义的属性“长度”

数据表:未捕获的类型错误:无法读取未定义的属性“按钮”

DataTable 未格式化日期时间