从sql server下载varbinary数据

我有一个带有Varbinary(Max)列的SQL Server表,它基本上是压缩数据。

我的页面允许用户下载此数据(在通常的用户身份validation之后)。

过去工作正常,数据量较小,但现在随着时间的推移,数据也越来越大。 在“保存”对话框出现之前,我基本上面临很多问题等待时间。

码:

  while (reader.Read()) { Response.Buffer = false; Response.Charset = ""; Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.ContentType = "application/gzip"; Response.AddHeader("content-disposition", "attachment;filename=" + "vbet_1_1.sdf.gz"); byte[] bytes = (Byte[])reader["backupdata"]; // STUCK HERE Response.BinaryWrite(bytes); Response.Flush(); Response.End(); } 

在调试器中,我可以看到

 byte[] bytes = (Byte[])reader["backupdata"]; 

是滞后的地方。

我的平台是ASP.Net,包含.NET Framework 4.0,SQL Server 2008,C#codebehind

您需要回传流响应。 读取内存中的整个文件然后将其写出不会扩展,随着请求数量文件大小的增加,您将开始耗尽服务器。

通过ASP.Net MVC和FILESTREAM MVC查看从SQL Server下载和上载图像:从SQL Server下载和上载图像以查看如何执行此操作的示例。 因为你不使用MVC而是直接ASP.NEt你可以更简单,但想法是相同的:

  • 使用流API来读取数据库响应(特别是带有CommandBehavior.SequentialAccess SqlCommand.ExecuteReade )并使用SqlDataReader.GetBytes()读取块中的响应(再次注意MSDN上有关SequentialAccess标志重要性的小剪辑…)
  • 使用流API编写HTTP响应。 Response.BinaryWrite()会做。

这可能会有所帮助:

 Response.AppendHeader("Content-Type", "application/gzip "); Response.OutputStream.Write((Byte[])reader["backupdata"],0,((Byte[])reader["backupdata"]).Length); 

您可以使用sql2012中的文件流表直接存储文件