C#中如何将IDataReader转换为Stream

How to convert IDataReader into Stream in C#

在我的 WCF 服务中,我使用 Command.ExecuteReader() 方法从 SQL 服务器检索数据。数据量非常大(大约 1+ GB)并通过 netTcp 绑定将此数据传输到客户端。

我打算在 WCF 中实现流模式而不是缓冲模式。任何人都可以指出任何文章或文档来做同样的事情。

简单来说,我的 objective 是将 IDataReader 转换为将传输到客户端和客户端的流对象,想要将此流转换回 dataset/datatable 或任何可以绑定的对象网格.

我无法将 IdataReader 转换为 IEnumerable,因为数据来自 SP,并且输出集中的列不断变化(我不想在代码中添加列限制)。

最终,将在数据集上完成从 WCF 服务到客户端应用程序的最终通信。如果有任何解决方案,例如将数据集转换为流,将其发送到客户端并在客户端将流转换回数据集,也可以解决我的问题。

您可以像这样将任何内容转换为流:

var stream = new MemoryStream(Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(datareader)));

但这不是最佳做法。你应该用你的数据读取器创建一个对象数组,然后 return 它。

您不应尝试将 IDataReader 转换为流,而应让您的数据访问方法 return 为表示查询结果的单行类型的 IEnumerable,如下所示:

public IEnumerable<Order> GetOrders()
{
   IDbCommand cmd = ...  <<build your command here>> ...
   using(var rdr = cmd.ExecuteDataReader())
   {
      while(rdr.Read())
      {
          Order order = new Order {Id=rdr.GetDecimal(1), Name=rdr.GetString(2)};
          yield return order;
      }
   }
}

接下来您可以将此方法的结果序列化为流(例如@Mohamed 所示)。通过这种方式,您可以将对象列表发送到客户端,而无需将完整的结果集加载到内存中。并且您仍然确定在 reader 到达结果末尾时处理数据 reader。