0

我需要从 C# .NET Standard 中的 Advantage DB 导出数据,并将结果以 JSON 格式写入文件。但是,由于返回的数据量可能很大,我需要避免在任何给定时间将整个结果集拉入内存。

这是我当前的解决方案,它忽略了内存限制。

AdsConnection conn = new AdsConnection(payload.connectionString);
AdsCommand command;
AdsDataReader reader;

try {
  conn.Open();

  command = conn.CreateCommand();
  command.CommandText = (string) payload.query;
  reader = command.ExecuteReader();

  var data = new DataTable();
  data.Load(reader);

  return JsonConvert.SerializeObject(data, Formatting.None, new TrimmingConverter());
} catch (Exception e) {
  return e;
} finally {
  if (conn != null) {
      conn.Close();
  }
}

将阅读器加载到 aDataTable是我能找到的最好的解决方案,它可以轻松创建可由 Newtonsoft 序列化的数据表示,但这data.Load(reader)几乎可以肯定是将整个结果集拉入内存。

看来我可以使用以下代码行中的某些内容来流式传输序列化

AdsConnection conn.Open();
AdsCommand command = conn.CreateCommand();
command.CommandText = (string) payload.query;
AdsDataReader reader = command.ExecuteReader();

DataTable data = new DataTable();
data.Load(reader);

using (FileStream fs = File.Open(@"c:\db_export.json", FileMode.CreateNew))
using (StreamWriter sw = new StreamWriter(fs))
using (JsonWriter jw = new JsonTextWriter(sw))
{ 
  JsonSerializer serializer = new JsonSerializer();
  serializer.Serialize(jw, data);
}

但是,我似乎找不到将结果集完全加载到DataTable第一个的方法。有什么方法可以将结果集DataReader直接流式传输到JsonSerializer

4

0 回答 0