WCF - 从打开的SqlDataReader流

时间:2015-03-26 16:11:25

标签: .net wcf streaming sqldatareader

在我的服务中,我有一个我希望流式传输的大型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

1 个答案:

答案 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

您最好的解决方案可能是将您的请求/提取分解为更小的块。但是,如果您不能这样做,您可以构建流式解决方案。该文档提供了一些示例和要求。