我需要通过Web向用户导出一个大量的数据(~100MB)从SQL表。如何做到最好?一个想法是将数据导出到数据库服务器上的一个文件夹中,通过某种方式对其进行压缩,然后为用户提供下载链接。还有其他方法吗?另外,我们可以在SQL Server内部压缩数据吗?
欢迎尝试任何方法。
我需要通过Web向用户导出一个大量的数据(~100MB)从SQL表。如何做到最好?一个想法是将数据导出到数据库服务器上的一个文件夹中,通过某种方式对其进行压缩,然后为用户提供下载链接。还有其他方法吗?另外,我们可以在SQL Server内部压缩数据吗?
欢迎尝试任何方法。
即使对于高速用户,我也不会让数据库等待用户下载100Mb的文件。当用户请求文件时,请他们指定一个电子邮件地址。然后调用异步进程来提取数据,将其写入临时文件(毕竟不希望内存中有超过100MB的文件),然后将临时文件压缩到存储位置,最后发送一封带有下载链接的电子邮件给用户。
Response.AddHeader("Content-Disposition",
"attachment; filename=yourfile.csv");
Response.ContentType = "text/plain";
一定要关闭缓冲,这样在构建第二部分时,IIS可以开始发送文件的第一部分:
Response.BufferOutput = false;
之后,您可以像这样开始编写文件:
Response.Write("field1,field2,field3\r\n");
Response.End();
下载链接是一个完全有效和合理的解决方案。另一个解决方案是自动将用户重定向到该文件,以便他们不需要点击链接。这真的取决于您的工作流程和UI体验。
我建议不要在SQL Server引擎中实现压缩。相反,请查看DotNetZip库(或System.IO.Conpression,如果您认为您的用户有解压缩gzip存档的能力),并在Web应用程序中实现压缩。
这将缩小XML文件的大小,使其传输时只有1/3或1/4。因为XML文件存在固有的浪费空间,所以这不是最高性能的选项,但很多取决于最终需要的格式。
另一个选择是使用免费的CSharpZipLib将XML(或任何您想要的格式)压缩成用户将下载的zip文件。如果这是经常使用的东西,那么您可能需要考虑进行缓存并将zip文件存储在Web服务器上,并设置某种过期时间,以便它不会为每个请求重新生成。
你的方法很好。如果你需要多次执行此操作,SSIS + 7zip可能会有用于自动化处理。