无法序列化 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”