我有一个SQL Server表,其中Varbinary(Max)
列基本上是压缩数据。
我的页面允许用户下载此数据(在通常的用户身份验证之后)。
以前工作正常,数据量较小,但现在随着时间的推移,数据也越来越大。在出现“保存”对话框之前,我基本上面临很多问题等待时间。
代码:
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
答案 0 :(得分:1)
您需要回传流响应。读取内存中的整个文件,然后将其写出来不会扩展,随着请求数量或文件大小的增加,您将开始耗尽服务器。
查看Download and Upload images from SQL Server via ASP.Net MVC和FILESTREAM MVC: Download and Upload images from SQL Server,了解如何执行此操作的示例。因为你不使用MVC而是使用ASP.NEt你可以做得更简单,但想法是一样的:
SqlCommand.ExecuteReade
CommandBehavior.SequentialAccess
)并使用SqlDataReader.GetBytes()
以块的形式读取响应(再次注意MSDN上关于重要性的小剪辑) SequentialAccess
旗帜......)Response.BinaryWrite()
会这样做。答案 1 :(得分:1)
这可能会有所帮助:
Response.AppendHeader("Content-Type", "application/gzip ");
Response.OutputStream.Write((Byte[])reader["backupdata"],0,((Byte[])reader["backupdata"]).Length);
您可以使用sql2012中的文件流表直接存储文件