我需要通过网络将大量数据(~100mb)从sql表导出到用户。这样做的最佳解决方案是什么?一种想法是将数据导出到数据库服务器上的文件夹,压缩它(通过某种方式),然后为用户提供下载链接。这样做的任何其他方法?另外,我们可以从sql server中压缩数据吗?
欢迎任何方法。
答案 0 :(得分:4)
我不会占用数据库,等待用户下载100Mb,即使对于高速用户也是如此。当用户请求文件时,他们指定一个电子邮件地址。然后调用异步进程来提取数据,将其写入临时文件(毕竟不要在内存中包含> 100mb),然后将临时文件压缩到存储位置,然后向用户发送带有链接的电子邮件。下载文件。
答案 1 :(得分:3)
您可以使用文件回复页面请求:
Response.AddHeader("Content-Disposition",
"attachment; filename=yourfile.csv");
Response.ContentType = "text/plain";
请务必关闭缓存,以便IIS在构建第二部分时开始发送文件的第一部分:
Response.BufferOutput = false;
之后,您可以开始编写文件:
Response.Write("field1,field2,field3\r\n");
完全写入文件后,请结束响应,因此ASP.NET不会将网页附加到您的文件中:
Response.End();
这样,您不必在Web服务器上编写文件,只需在内存中创建文件并将其发送给用户。
如果需要压缩,您可以以相同的方式编写ZIP文件。这是一个很好的free library来创建ZIP文件。
答案 2 :(得分:0)
下载链接是完全有效且合理的解决方案。另一种方法是自动将用户重定向到该文件,这样他们就不需要点击链接了。这实际上取决于您的工作流程和UI体验。
我建议不要在SQL Server引擎中实现压缩。而是查看DotNetZip库(如果您认为您的用户具有解压缩gzip存档的能力,则选择System.IO.Conpression)并在Web应用程序中实现压缩。
答案 3 :(得分:0)
如果XML没问题,一种方法是选择数据“FOR XML”,如下所示: http://www.sqljunkies.ddj.com/Article/296D1B56-8BDD-4236-808F-E62CC1908C4E.scuk
然后将原始XML直接吐出到浏览器作为content-type:text / xml。还要确保在Web服务器上为具有XML扩展名的文件设置Gzip压缩。 http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/502ef631-3695-4616-b268-cbe7cf1351ce.mspx?mfr=true
这会将XML文件缩小到传输大小的1/3或1/4。由于XML文件中固有的浪费空间,这不是最高性能选项,但很大程度上取决于您最终要寻找的格式。
另一种选择是使用免费的CSharpZipLib将XML(或任何您想要的格式)压缩成用户可下载的zip文件。除此之外,如果这是经常使用的内容,您可能需要查看缓存并将zip文件存储在Web服务器上,并且有一些到期时间,因此不会为每个请求重新生成。
答案 4 :(得分:0)
你的方法很好。如果您需要多次执行此操作,SSIS + 7zip可能对自动化过程很有用。