返回“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