.NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常)
.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数据库中文件流保存的大电子文件方法(不会报内存溢出异常)的更多相关文章
- 转:SQL SERVER数据库中实现快速的数据提取和数据分页
探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...
- C#从SQL server数据库中读取l图片和存入图片
原文:C#从SQL server数据库中读取l图片和存入图片 本实例主要介绍如何将图片存入数据库.将图片存入数据库,首先要在数据库中建立一张表,将存储图片的字段类型设为Image类型,用FileStr ...
- 浅析SQL Server数据库中的伪列以及伪列的含义
SQL Server中的伪列 下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值:对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个 ...
- SQL Server数据库中的系统数据库?
SQL Server的系统数据库分为:master,model,msdb和tempdb 1.Master数据库 Master数据库记录SQL Server系统的所有系统级别信息(表sysobjects ...
- sql server数据库中char,varchar,nvarchar字段的区别
Char,varchar,nvarchar字段是sql server数据库中的三种字段类型.好多人在选择存储的时候不知道如何抉择,我给大家讲下这个三个字段类型的区别. Char(n)是长度为n个字节的 ...
- 如何将Sql server数据库中的模型图转化到Word中--并能够查看字段的属性信息
1. 在Sql server数据库中创建数据库的模型图 -- Database Diagrams 2. 控制面板--管理工具--ODBC数据源链接--创建一个Sql server的数据源链接 3. 打 ...
- 清空SQL Server数据库中所有表数据的方法(转)
清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入 ...
- SQL server数据库中的DateTime类型出现的问题
我们知道这个SQL server数据库中的DateTime类型是数据库应用开发中经经常使用到的一种数据类型.而C#语言中也有DateTime类型,尽管二者都是用来描写叙述时间的,可是它们的默认值是不同 ...
- C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]
C#同步SQL Server数据库中的数据 1. 先写个sql处理类: using System; using System.Collections.Generic; using System.Dat ...
随机推荐
- NET中的引用类型和值类型 zt
.NET中的类型分为值类型和引用类型,他们在内存布局,分配,相等性,赋值,存储以及一些其他的特性上有很多不同,这些不同将会直接影响到我们应用程序 的效率.本文视图对.NET 基础类型中的值类型和引用类 ...
- bootstrap布局两列或者多列表单
1, 代码如下: <div class="form-group"> <label for="starttime" class="co ...
- CodeBlocks+opencv2.4.4+cmake+MinGW
/*-----------------------------------------------------------------------------* * 版权声明:* 可以任意 ...
- JSP---JavaBean的使用-jsp:useBean标签相关
JavaBean介绍: JavaBean其实就是一个遵循特定写法的java类,但是必须具有如下特点: 1.这个java类必须具有一个公开的无参构造函数 2.属性必须私有化,类必须公开 3.私有化的属性 ...
- IntelliJ 直接编辑国际化文件(properties)方法
IntelliJ 直接编辑国际化文件(properties)方法 settings-File Encodings 右下角 Transparent native-to-ascii conversion的 ...
- CentOS的Redis内存分配策略配置
安装了一主两从节点,启动之后发现有一个警告: 大概是说overcommit_memory设置成了0,在低内存环境下后台保存可能会失败,设置成1重启可解决. 然后,不太懂这个配置的含义,google一把 ...
- [一]初识SpringMVC
是什么? web开发框架 为什么用? 功能强大 怎么做? 1.导入jar包 2.配置web.xml <?xml version="1.0" encoding="UT ...
- NOIopenjudge 407:Heritage
总时间限制: 5000ms 内存限制: 65536kB 描述 Your rich uncle died recently, and the heritage needs to be divided ...
- IOS - view之间切换
//进入下一页 - (IBAction)Go:(id)sender { TwoViewController *twoVC = [[TwoViewController alloc] init];//这里 ...
- 关于IOS中UIWebView 加载HTML内容
NSString *strContent=[info objectForKey:@"newContent"]; { NSArray *paths = NSSearchPathFor ...