1

本主题与此处的问题有关:

如何使用 C# WCF RESTful(即 Web)服务发送 CSV 文件?

通过使用http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx中讨论的方法,我能够发送一个非常小的数据集,它解释了如何利用“RAW”编程模型来发送响应——我正在使用 MemoryStream 类。

public Stream ReturnCSVSample()
{
    string csv = "Hello, World\nGoodBye, For, Now\n";
    byte[] csvBytes = Encoding.UTF8.GetBytes(csv);

    WebOperationContext.Current.OutgoingResponse.ContentType = "text/csv";

    return new MemoryStream(csvBytes);
}

这工作正常。然而,实际上,我从一个两列宽的 SQL 数据库表中检索大约 144,000 条记录,并使用字符串连接将其格式化为 CSV。然后,我获取这个字符串,将其编码为字节数组并将其作为 MemoryStream 对象返回。我让服务运行了 20 多分钟,但仍然没有完成!我已经确定瓶颈是字符串连接。为什么?因为我执行了检索这 144,000 条记录并将其存储到我创建的类的操作,最多需要几分钟才能完成。

要么是一个大的字符串效率低下,要么有更好的方法来对我指定的记录数量执行字符串连接。

如何通过具有大型数据集的 Web 服务发送 CSV 流?

谢谢你。

4

1 回答 1

1

AStreamWriter()会比字符串连接做得更好:

public Stream LoadStreamSample(Stream ms)
{
    using (StreamWriter sw = new StreamWriter(ms, Encoding.UTF8)){
        // Call SQL and iterate over rows from SqlDataReader here...
        while (dr.Read()){
            // replace following with csv of one record
            string csv = "Hello, World\nGoodBye, For, Now\n";
            sw.WriteLine(csv)
        }
    }
    return ms;
}
于 2013-06-26T17:34:50.773 回答