.NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常)

前段时间项目使用一次性读去SQL Server中保存的电子文件的文件流然后返回给客户端保存下载电子文件,在电子文件超过一定的大小的时候出现可恶的内存溢出!各种百度、google还是没找到解决的方法,最后不得不找微软的技术专家一起来解决大电子文件通过客户端浏览器下载这个异常,经过一段时间后找到一个理想的方案如下,性能虽然不高,但是基本能解决问题了,方法如下:

1.通过DataReader的方式来获取数据库中保存的电子文件的二进制流

public SqlDataReader GetFile(int fileID)
        {
            SqlDataReader myReader = ExecuteReader("select FileName,FileSize,FileContext from T_File where ID =" + fileID);
            return myReader;
        }

2.执行查询SqlDataReader的方法也有一个需要注意的地方, SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);

CommandBehavior.SequentialAccess的解释是提供一种方法,以便DataReader处理包含大二进制值的数据列,SequentialAccess不是加载整行,而是将DataReader

作为流来加载,然后可以使用GetBytes或者GetChars方法来读取指定位置的的字节并返回正在读取的数据的缓冲区的大小;

/// <summary>
        /// 执行查询语句,返回SqlDataReader
        /// </summary>
        /// <param name="strSql">查询语句</param>
        /// <returns>文件名称</returns>
        public static SqlDataReader ExecuteReader(string strSql)
        {
            SqlConnection connection = new SqlConnection(connectionString);
            SqlCommand cmd = new SqlCommand(strSql, connection);
            try
            {
                connection.Open();
                SqlDataReader myReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
                return myReader;
            }
            catch (System.Data.SqlClient.SqlException e)
            {
                throw e;
            }
        }

3.读取到电子文件的DataReader后,以下是下载方法:

    SqlDataReader reader = GetFile(attaID);

string fileName = "";
                int bufferSize = 102400;//每次读取的缓冲区大小100KB
                byte[] outByte = new byte[bufferSize];
                int retval;//返回的值
                int startIndex = 0;//开始读取的位置
                string length;
                bool more = true;
                try
                {
                    reader.Read();//开始读取
                    fileName = reader.GetString(0);
                    length = reader.GetString(1);
                    length = (double.Parse(length) * 1024).ToString();
                    Response.Clear();//这里能解决64位windows Server2008服务器和2003服务器下载要求输入密码的问题
                    Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
                    Response.AddHeader("Content-Length", length);
                    Response.AddHeader("Content-Transfer-Encoding", "binary");
                    Response.ContentType = "application/octet-stream";
                    Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
                    do
                    {
                        retval = (int)reader.GetBytes(2, startIndex, outByte, 0, bufferSize);
                        if (Response.IsClientConnected)//判断客户端是否一直处于连接状态
                        {

          //输出二进制数据给客户端
                            Response.OutputStream.Write(outByte, 0, retval);
                            Response.Flush();
                        }
                        startIndex += bufferSize;
                        if (retval < bufferSize)
                            more = false;
                    }
                    while (more);
                    Response.Close();
                }
                catch (Exception ex)
                {
                     throw New Exception("下载出错!");

}
                finally
                {
                    reader.Close();
                    Response.Close();
                }

.NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常)的更多相关文章

  1. 转:SQL SERVER数据库中实现快速的数据提取和数据分页

    探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...

  2. C#从SQL server数据库中读取l图片和存入图片

    原文:C#从SQL server数据库中读取l图片和存入图片 本实例主要介绍如何将图片存入数据库.将图片存入数据库,首先要在数据库中建立一张表,将存储图片的字段类型设为Image类型,用FileStr ...

  3. 浅析SQL Server数据库中的伪列以及伪列的含义

    SQL Server中的伪列 下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值:对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个 ...

  4. SQL Server数据库中的系统数据库?

    SQL Server的系统数据库分为:master,model,msdb和tempdb 1.Master数据库 Master数据库记录SQL Server系统的所有系统级别信息(表sysobjects ...

  5. sql server数据库中char,varchar,nvarchar字段的区别

    Char,varchar,nvarchar字段是sql server数据库中的三种字段类型.好多人在选择存储的时候不知道如何抉择,我给大家讲下这个三个字段类型的区别. Char(n)是长度为n个字节的 ...

  6. 如何将Sql server数据库中的模型图转化到Word中--并能够查看字段的属性信息

    1. 在Sql server数据库中创建数据库的模型图 -- Database Diagrams 2. 控制面板--管理工具--ODBC数据源链接--创建一个Sql server的数据源链接 3. 打 ...

  7. 清空SQL Server数据库中所有表数据的方法(转)

    清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入 ...

  8. SQL server数据库中的DateTime类型出现的问题

    我们知道这个SQL server数据库中的DateTime类型是数据库应用开发中经经常使用到的一种数据类型.而C#语言中也有DateTime类型,尽管二者都是用来描写叙述时间的,可是它们的默认值是不同 ...

  9. C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]

    C#同步SQL Server数据库中的数据 1. 先写个sql处理类: using System; using System.Collections.Generic; using System.Dat ...

随机推荐

  1. lightoj 1010

    题意,在一个n*n的棋盘上放置一些马,使这些马不能互相攻击,问最多能放多少. 思路:从第一行每隔一个放置一个马即可,注意n=1和n=2的情况要特判. #include<cstdio> in ...

  2. 跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量

    跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量 This example program demonstrates the basic usage of a measure object. ...

  3. cs编写php字符显示问题

    1.  mysql中有mysql字符,数据库字符(各个数据库字符可不同),数据库下的表字符,表的字段字符,这些字符应保持一致具体查询命令可见网上,如不同要设置成相同才行. 2.  因为浏览器版本不同所 ...

  4. 冒泡算法(C++模板实现)

    冒泡排序 从整体上看,冒泡排序是一种稳定排序,即排序完成后,原本序列中的键值相等的元素相对位置不会发生改变.算法的时间复杂度是O(n2),空间复杂度为O(1),即这是一个"就地算法" ...

  5. 《Introduction to Algorithm》-chaper30-多项式与快速傅里叶变换

    两个n次多项式的相加最直接的方法所需要的时间是O(n),而实现两个n次多项式的乘法的直接方法则需要O(n^2),本章讨论的快速傅里叶变换(FFT),将会将这一过程的时间复杂度降至O(nlogn).同时 ...

  6. ZOJ-3720 Magnet Darts 计算几何,概率

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3720 题意:在一个矩形区域投掷飞镖,每个整点有磁性,每个点的磁性 ...

  7. [一]初识JFreeChart

    是什么? Java报表工具 原理? 封装好数据,调用工厂,创建一张图片,返回一个图片的名字,直接在页面上显示即可 怎么做? 需要导入jar,并在web.xml文件中进行相关的配置即可

  8. Spring源码入门——DefaultBeanNameGenerator解析

    我们知道在spring中每个bean都要有一个id或者name标示每个唯一的bean,在xml中定义一个bean可以指定其id和name值,但那些没有指定的,或者注解的spring的beanname怎 ...

  9. local storage 简单应用‘’记住密码’

    前些时候一直用cookie等来进行登录页面记住面膜操作,但是由于其存储容量小等缘故,所以后来转向local storage,原理为:当用户勾选记住密码时,local storage 存储用户名密码同时 ...

  10. java中通过反射获取方法并且调用(getMethod和invoke深入)实践

    为了支持业务的快速变更,往往采用可配置的方式,将业务逻辑的处理部分配置在数据库中或者XMl文件里.配置什么,如何配置才更灵活,That's a problem. 以数据库配置为例(xml相同),在数据 ...