在我的服务中,我有一个我希望流式传输的大型SQL结果集。不久之前,我们已经提出了同样的问题somewhere else,但没有回复。所以我可以自由引用它:
在服务中,我使用
SqlDataReader
读取所有数据并将数据写入返回流,然后返回 流。上述解决方案的问题是服务读取 将整个结果集放入流中,然后返回流。我希望能够做的是将
SqlDataReader
使用的基础流返回给客户端,或者将流返回给客户端 虽然sqldatareader
仍在将数据输入其中 服务。我想要的行为类似于你得到的行为 从WCF服务返回FileStream
时。在客户端,你 可以立即开始访问文件中的行 无论文件大小如何。
您可以想象,在我的服务中缓冲整个结果会导致内存不足。
澄清一下:我不是要尝试返回SqlDataReader
,而是将行序列化为Stream,如下所示:
Public Shared Function DataReaderToExcelXml(ByRef dr As SqlDataReader) As Stream
Dim ms As New MemoryStream
Dim tw As New IO.StreamWriter(ms)
For Each row As DbDataRecord In dr
'Embed row in ExcelXml, detailed function omitted
tw.write(row.toString()) 'row.toString is just a simplification
End While
tw.Flush()
dr.Close()
ms.Seek(0, SeekOrigin.Begin)
Return ms
End Function
答案 0 :(得分:0)
在WCF中流式传输大数据时查看此资源: https://msdn.microsoft.com/en-us/library/ms733742%28v=vs.110%29.aspx
和更详细的流媒体示例: https://msdn.microsoft.com/en-us/library/ms751463%28v=vs.110%29.aspx
您最好的解决方案可能是将您的请求/提取分解为更小的块。但是,如果您不能这样做,您可以构建流式解决方案。该文档提供了一些示例和要求。