用ASP.NET 2.0在数据库中存储二进制文件

一、引言

在构建数据驱动的应用程序时,经常需要捕获文本和二进制数据。这样的程 序可能需要存储图像,PDF,Word文件或其它二进制数据。能够使用两种方式来 存储这些二进制数据:存储在web服务器的文件系统上并添加一个对数据库中相 应文件的引用;或直接存储在数据库本身。

文本数据,例如字符串,数字,日期,GUID,货币值,等等-在数据库系统中 都有适当的和相应的数据类型定义。例如,在Microsoft SQL Server中,你可以 使用int数据类型来存储一个整数值;而为了存储一个字符串值,你可以使用一 个varchar或nvarchar类型。另外,数据库还提供了用于存储二进制数据的类型 定义。在Microsoft SQL SERVER 2000及早期版本中,使用image数据类型来存储 二进制数据;而在SQL SERVER 2005中,使用varbinary(MAX)数据类型。使用上 面两种方式中的任何一种,这些数据类型都能够存储可达2GB大小的二进制数据 。

不过,当直接把二进制数据存储在数据库时,需要增加一些额外工作来实现 插入、更新和检索二进制数据。幸好,我们可以通过更高级的数据存取库-例如 ADO.NET-对这种复杂的低级T-SQL操作加以抽象,从而使问题变得相当简单。然 而,通过ADO.NET方式使用二进制数据与使用文本数据的确有点不同。在本文中 ,我们将分析如何使用ADO.NET和ASP.NET 2.0 SqlDataSource控件直接通过一个 数据库来存储和检索图像文件。请接着往下阅读!

二、把数据存储在数据库中与存储在文件系统中的比较

正如刚才介绍的,当捕获一个应用程序中的二进制数据时,该二进制数据既 可以直接存储在数据库中也可以作为一个文件保存在web服务器的文件系统中-仅 保持一个对数据库中文件的引用。根据我的体验,我发现大多数开发者更喜欢在 文件系统中存储二进制数据,这主要基于下列原因:

·需要较少的工作-存储和检索存储在数据库中的二进制需要更多的编码工作 。而且,更新这些二进制数据也会更为容易-不需要与数据库通讯,只须直接修 改文件即可!

·指向文件的URL更为直接-正如我们将在本文中所看到的,为了提供存取存 储在一个数据库中的二进制数据,我们需要创建另一个能够返回该数据的 ASP.NET页面。典型地,会把相应于数据库中对应记录(返回它的二进制数据) 的一个唯一的标识符传递给这个页面。结果是,为了存取该二进制数据-比方说 一个上传的图像-该URL看上去如http://www.yourserver.com/ShowImage.aspx? ID=4352的形式,而如果该图像直接存储在文件系统中,URL将更为直接些-例如 jpg/Sam.jpg。

·为显示图像提供更好的工具支持-如果你在使用ASP.NET 2.0,那么,你可 以在GridView或DetailsView控件中使用ImageField控件来显示一个图像(它的 图像路径存储在数据库中)。然而,遗憾的是,这个ImageField却无法直接显示 数据库中的图像数据(既然它要求查询一个外部页面并且返回相应的数据)。

·性能-既然二进制文件存储在web服务器的文件系统而不是存储在数据库中 ,那么,应用程序可以访问数据库中较少的数据,从而减少了对数据库的要求, 也相应地减少了存在于web和数据库服务器之间的网络拥挤。

把数据直接存储在数据库的主要优点在于,它能够使数据成为"自包含的"。 既然所有的数据都包含在数据库中,那么,数据支持、数据在数据库服务器间的 移动以及数据库复制等等就容易得多了,因为不存在担心复制或备份存储在文件 系统中的二进制内容这样的问题。

如往常一样,至于选择哪种存储方案要具体依赖于实际的使用场所和业务需 要。例如,我开发过一个客户端,其中的二进制数据必须存储在数据库中,因为 它们使用的报告软件仅能够在报告中包括二进制数据-如果它来自于数据库的话 。在另一种情况下,我的一个同事在开发一个工程,其中的二进制文件需要为 web应用程序使用并且可经由FTP使用,这种情况很有必要把二进制数据存储在文 件系统中。

三、创建一个存储二进制数据的数据库表格

本文中的其它部分将分析一个简单的ASP.NET2.0图像画廊应用程序,我使用 微软SQL Server 2005 Express Edition编写的,用于展示本文所阐述的直接从 一个数据库中存储和检索二进制数据的相关概念。

这个图像画廊应用程序的数据模型包括一个表格-Pictures,其中的每一个记 录对应画廊中的一幅图片。这个Pictures表格的MIMEType域中存储了上载图像( 对于JPG文件是image/jpeg,对于GIF文件是image/gif,等等)的MIME类型;这里 的MIME类型向浏览器指定如何生成该二进制数据。其中的ImageData列则存储了 该图片实际的二进制内容。

时间: 2025-01-29 08:13:00

用ASP.NET 2.0在数据库中存储二进制文件的相关文章

“ASP.NET 2.0 正式版中无刷新页面的开发”中示例代码与Firefox兼容的解决

asp.net|解决|示例|刷新|无刷新|页面 这几天正着手开始写毕业设计,因为发生了一些事情,所以一直拖到现在才开始.其实我准备做一个ASP.NET 2.0并且使用AJAX的Web项目,于是到博客园到处寻着AJAX的文章,恰好翻到了Leon.Zhou的ASP.NET 2.0 正式版中无刷新页面的开发按照代码示例和讲解做了一个页面,确实不错啊.因为俺平时几乎都用Firefox,所以就顺手测试了一下Firefox下的效果,结果发现点了Button之后没有反应--于是打开Javascript控制台,

asp.net用gridview显示数据库中两个表的数据?

问题描述 asp.net用gridview显示数据库中两个表的数据? asp.net用gridview显示数据库中两个表的数据?把两表绑定在datatable并用gridview显示数据 解决方案 两个表什么关系?如果是一样的表结构,用union连接,如果是主系表关系,那么可以用join.具体按照我说的google下. 解决方案二: 不管是查询几个表,最后通过sql语句走ado.net,查询出来的数据都放入DataTable或DataSet中,然后绑定到gridview 解决方案三: 如果是一起

asp.net 4.0+ webform程序中集成mvc4_实用技巧

本文为大家分享了asp.net 4.0+ webform程序中集成mvc4的方法,供大家参考,具体内容如下 1.新建packages.config文件,里面加上必要的程序集  <?xml version="1.0" encoding="utf-8"?> <packages> <package id="Microsoft.AspNet.Mvc" version="4.0.20710.0" targe

二进制数据-java从数据库中读取二进制文件并....

问题描述 java从数据库中读取二进制文件并.... java从postgresql数据库中读取bytea二进制并且生成文件(如word,pdf文件等)!在jsp页面上显示附件(如邮件形式那样的附件)并且可以下载!请问怎么实现啊?求解!谢谢了! 解决方案 首先你需要确定附件的类型及名称.然后下载很简单的,根据下载的请求返回 response.addHeader ("content-type", "application/RFC822"); response.addH

数据库中存储大量图片设计

1.图像的存储策略 在数据库的 开发过程中,经常需要在数据库中存储一些备注信息,而这些备注信息的内容一般较大,格式多样-如有可能是语音文件.视频文件.图片文件.文本文件等,怎样 实现这些格式不同的备注文件的存取及预览,一直是开发人员比较关心的一个问题,本文系统的介绍了三种存取备注二进制信息的方法. 对备注二进制信息的存储可以采用以下三种方式: 方法一:文件保存在固定的路径下,数据库中存取文件路径和名称 方法二:数据库中用blob类型或者varbinary类型字段存储备注文件 方法三:在本地用Po

sqlite3-在 SQlite 数据库中存储 Null

问题描述 在 SQlite 数据库中存储 Null 我想实现下面的代码: String updateQuery ="INSERT INTO MAAccounts(userId, accountId, accountType, accountName, parentAccountId ) VALUES(?, ?, ?, ?, ?)"; Cursor c = mDb.rawQuery(updateQuery, new String[]{ stringToDB(account.userId)

sql server-SQLServer如何定位数据库中存储的是那些信息

问题描述 SQLServer如何定位数据库中存储的是那些信息 我有一个网站后台数据库的备份,并且已经在自己机器上还原了,现在我想知道 这个数据库里面的每张表都对应的是网站上的那些信息,有什么好点的办法么?求大神指导 解决方案 这个需要分析,数据库存放数据跟网站信息对应是逻辑关系,只有网站开发者清楚,你需要先分析网站的数据是如何读取,组织的.然后再结合数据库来看各个字段是如何对应关系 解决方案二: NULL在SQLServer数据库日志文件中的存储 解决方案三: 这个只能通过字段找到那些内容是属于

网站上传的图片是怎么在数据库中存储的

问题描述 网站上传的图片是怎么在数据库中存储的,要是存在数据库中是不是增加数据库的负担,读写效率方面也不高?要是数据库只存放路径,图片存在web服务器文件夹里安全吗?QQ空间照片是怎么存储的?像百度文库doc.txt.pdf文件又是怎么存储的呢 解决方案 1.存到数据库里面,就是对图片数据进行序列化,可以保存到数据库里面2.存库和存硬盘的效率应该是差不多的,如果图片不多,存在库里面和存在硬盘上都一样,如果内容多了存在数据库里面会不方便,对于备份.恢复等操作不太方便3.图片存在web文件夹里面安全

《Metasploit渗透测试手册》—第1章1.10节分析数据库中存储的渗透测试结果

1.10 分析数据库中存储的渗透测试结果Metasploit渗透测试手册在数据库存储测试结果后,下一步工作就是对其进行分析,分析有助于更深入地理解目标系统.根据使用需求的不同,数据库中的测试结果可以长期存储,也可以短期存储. 准备启动msfconsole,遵循前面介绍的操作步骤,建立数据库连接.可以用数据库存储新的测试结果,也可以用来分析以前存储的结果.可以导入前面Nmap扫描时创建的XML文件,以便对扫描结果进行分析. 怎样实现尝试一些重要命令,以便对存储结果有更清晰的理解. 上图展示了hos