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

34gzjxbg  于 2023-06-05  发布在  Oracle
关注(0)|答案(2)|浏览(274)

我需要将所有的数据表导出到单独的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);

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

mzaanser

mzaanser1#

正如异常所说的-表没有设置TableName属性。你只需要设置它。

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

8cdiaqws2#

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

因此,如果您希望将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

相关问题