我需要从 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?