ASP.NET 2.0数据教程之五十六:添加新记录时包含一个文件上传选项

返回“ASP.NET 2.0数据教程目录”

导言:

在前面2节教程,我们探讨了如何使用FileUpload控件从客户端 向服务器上传文件,以及如何在数据Web控件里显示二进制数据。

在本节 ,我们将创建一个web页面以添加新的种类。除了为类的name和description属性 添加TextBoxes控件外,我们还要在页面上添加2个FileUpload控件 ——一个用来上传新类的图片,另一个用来上传类的小说明册子。上 传的图片将直接存储在新记录的Picture列。与此相反,小册子将存储在 ~/Brochures 文件夹,同时将文件路径存储在新记录的BrochurePath列。

在创建页面之前,我们需要更新体系结构。由于CategoriesTableAdapter的主查 询并不返回Picture列,因此自动生产的Insert方法只包含了CategoryName, Description和BrochurePath列。我们需要在TableAdapter里创建新的方法以包括 Categories的4个列。同时业务逻辑层的的CategoriesBLL类也需要更新。

第1步:在CategoriesTableAdapter添加一个InsertWithPicture方法

在前 面的教程《创建一个数据访问层》里我们创建了CategoriesTableAdapter,并设 置其自动生成了基于主查询的INSERT, UPDATE和DELETE命令。此外,我们设置该 TableAdapter启用DB Direct方法,它将创建Insert, Update和Delete方法。这些 方法执行自动生成的INSERT, UPDATE和DELETE命令,自然而然的,其接受的输入 参数基于主查询所返回的那些列。在教程《上传文件》里,我们扩展了 CategoriesTableAdapter的主查询以包含BrochurePath列。

因为 CategoriesTableAdapter的主查询并为引用Picture,在添加新记录或更新记录时 不能涉及Picture值。为了获取Picture信息,我们要么在TableAdapter里创建一 个新方法以插入Picture的二进制数据;要么定制自动生成的INSERT命令。但定制 自动生成的INSERT命令有一个风险,即定制的INSERT命令有可能被向导覆盖。比 如,假设我们定制INSERT命令使用Picture列,更新TableAdapter的Insert方法, 使之多包含一个对应picture二进制数据的参数。然后在业务逻辑层创建一个方法 使用该 DAL方法,再在表现层调用该业务逻辑层方法。现在一切工作正常,但当 下一次在TableAdapter设置向导里设置TableAdapter完成后,我们定制的INSERT 命令马上就会被向导重写,回归到定制前的状态。其结果是我们的代码将无法编 译!

注意:

如果使用存储过程而不用SQL语句的话,就不存在这个 问题。在以后的教程里,我们将探讨在数据访问层用存储过程替代SQL语句。

为避免这个头痛的问题,我们为TableAdapter添加新的方法,而不定制自 动生成的SQL命令。我们为添加的方法命名为InsertWithPicture,它接受 CategoryName, Description, BrochurePath和Picture值;执行INSERT命令将上 述值添加进一条记录。

在CategoriesTableAdapter的顶部点右键,选择 “添加查询”。进入TableAdapter 查询设置向导,首先询问我们 TableAdapter查询如何访问数据库,选择“使用SQL语句”,点Next, 因为我们要为表Categories添加新记录,选“INSERT”,点Next。


图1:选“INSERT”选项

现在,我们需要指定INSERT SQL语句。向导自动地生成一个基于主查询的INSERT语句。此时,它只插入 CategoryName, Description和BrochurePath值。对其更新,包括Picture列和参 数@Picture ,如下:

INSERT INTO [Categories]
   ([CategoryName], [Description], [BrochurePath], [Picture])
VALUES
  (@CategoryName, @Description, @BrochurePath, @Picture)

最后,向导要我们为方法命名,取名为 InsertWithPicture,点Finish。


图2:为新方法命名为InsertWithPicture

时间: 2024-10-03 21:47:00

ASP.NET 2.0数据教程之五十六:添加新记录时包含一个文件上传选项的相关文章

在ASP.NET 2.0中操作数据之五十四:添加新记录时包含一个文件上传选项_自学过程

导言: 在前面2节教程,我们探讨了如何使用FileUpload控件从客户端向服务器上传文件,以及如何在数据Web控件里显示二进制数据. 在本节,我们将创建一个web页面以添加新的种类.除了为类的name和description属性添加TextBoxes控件外,我们还要在页面上添加2个FileUpload控件--一个用来上传新类的图片,另一个用来上传类的小说明册子.上传的图片将直接存储在新记录的Picture列.与此相反,小册子将存储在~/Brochures 文件夹,同时将文件路径存储在新记录的B

ASP.NET 2.0数据教程之五十九:体系分层缓存数据

返回"ASP.NET 2.0数据教程目录" 导言: 正如前面章节所言,缓存ObjectDataSource的数据只需要简单的设 置一些属性.然而,它是在表现层对数据缓存,这就与ASP.NET page页面缓存策 略(caching policies)紧密的耦合(tightly couples)起来.我们对体系机构分层 的原因之一便是打破这种耦合.拿业务逻辑层为例,将业务逻辑从ASP.NET页面脱 离出来:而数据访问层将数据访问的细节ASP.NET页面脱离出来.从某种意义来说 ,将业务逻

ASP.NET 2.0数据教程之五十八:用ObjectDataSource缓存数据

返回"ASP.NET 2.0数据教程目录" 导言 就计算机科学而言,caching就是将所需要的数据或信息的备份放 在某个地方,便于快速访问的这样一个过程.以数据处理(data-driven)程序为 例,程序的大部分时间浪费在数据查询上.要提升这种程序的性能,通常的做法 是将查询结果存放在程序的存储器里. ASP.NET 2.0提供了各种各样的缓 存方式.对web页面和用户控件可以通过output caching进行缓存:同样我们可以 通过ObjectDataSource 和SqlDa

ASP.NET 2.0数据教程之五十四:上传文件

返回"ASP.NET 2.0数据教程目录" 导言: 到目前为止,我们的教程围绕的是text数据.然而,很多应用 程序既需要处理text数据,也需要处理二进制数据.比如招聘网站可能需要用户 上传Word或PDF格式的简历. 使用二进制数据面临一项挑战:在应用程序 中如何存储二进制数据.我们必须更新添加记录的界面以支持用户上传本地电脑 中的文件,并添加额外的功能以下载某条记录的相关二进制数据.本章以及接下 来的3章,我们探讨如何处理这些问题.在本系列教程结束时,我们将创建一个功 能完善的应

ASP.NET 2.0数据教程之五十二:为GridView控件添加Checkboxes列

返回"ASP.NET 2.0数据教程目录" 导言: 在前面的教程里我们探讨了如何为GridView控件添加radio buttons列.当用户最多只能选择一项数据时,我们可以在用户界面里添加radio buttons列,而有时候,我们需要选择任意多项数据.比如,基于Web的邮箱客户 端列出了一系列的邮件,及一列checkboxes,用户可选择任意封邮件并执行相同 的操作,比如移动到另一个文件夹或将之删除. 在本教程,我们将探讨如 何添加checkboxes列,以及发生页面回传后如何确定

ASP.NET 2.0数据教程之五十:对SqlDataSource控件使用开放式并发

返回"ASP.NET 2.0数据教程目录" 导言: 在前面的教程里,我们考察了如何为SqlDataSource控件添加插 入.更新.删除功能.简而言之,就是为其nsertCommand, UpdateCommand和 DeleteCommd属性赋以相应的INSERT,UPDATE和DELETESQL语句,并将相应的参数放 置在 <InsertParameters>, <UpdateParameters>和 <DeleteParameters>标签里.

ASP.NET 2.0数据教程之十六: 概述插入、更新和删除数据

返回"ASP.NET 2.0数据教程目录" 导言 结束前面的几节,我们已经探讨过了如何使用GridView.DetailsView 和FormView控件来显示数据.这些控件简单地操作提供给它的数据.一般地,这 些控件通过使用一个数据源控件,例如ObjectDataSource来存取数据.我们已经 看过了ObjectDataSource是如何在ASP.NET页面和潜在的数据之间扮演一个代理的 角色.当一个GridView需要显示数据时,它调用ObjectDataSource的Selec

ASP.NET 2.0数据教程之六十六:批添加数据

返回"ASP.NET 2.0数据教程目录" 导言: 在前面的第64章<Batch Updating>里,我们用GridView控件 里定制了一个批编辑界面,同样的我们也可以定制一个批添加界面.假设有这种情 况,我们接受一批从Tokyo(东京)发过来的货物:6种不同的tea 和 coffee,如果 用户在一个DetailsView控件里一次输入一个产品,他将会重复的输入很多相同的 值,比如相同的种类(Beverages),相同的供应商(Tokyo Traders),相同的 d

ASP.NET 2.0数据教程之四十六:DataList和Repeater里的自定义button

返回"ASP.NET 2.0数据教程目录" 导言 在前面关于DataList 和Repeater 的7章教程里,我们分别创建了 只读和可以编辑删除的例子.为了让DataList有编辑和删除的功能,我们在 ItemTemplate里添加了一些button,当点击时,引起postback,并根据button的 CommandName属性激发相关的事件.例如,添加一个CommandName为 "Edit"的button,在postback时会激发EditCommand事件