Asp.net2.0 ObjectDataSource控件详解

1 SqlDataSourceObjectDataSource控件的比较
ASP.NET2.0提供了 SqlDataSource 数据源控件,后者支持用于指定连接字符串、 SQL 语句或存储过程的属性,用以查询或修改数据库。但是, SqlDataSource 控件存在一个问题:该控件的缺点在于它迫使您将用户界面层与业务逻辑层混合在一起。然而随着应用程序规模的扩大,您会越来越感觉到混合多个层的做法是不可取的。 生成严格意义上的多层 Web 应用程序时,您应该具有清晰的用户界面层、业务逻辑层和数据访问层。仅仅由于 SqlDataSource 控件的强制而在用户界面层引用 SQL 语句或存储过程是不可取的。
SqlDataSource ObjectDataSource 的选择,从这某中意义上说,前者适合大多数小规模的个人或业余站点,而对于较大规模的企业级应用程序,在应用程序的呈现页中直接存储 SQL 语句可能很快就会变得无法维护。这些应用程序通常需要用中间层数据访问层或业务组件构成的封装性更好的数据模型。所以使用 ObjectDataSource 控件是一种较为明智和通用的做法。
 
2 ObjectDataSource 的概述
ObjectDataSource 控件对象模型类似于 SqlDataSource 控件。 ObjectDataSource 公开一个 TypeName 属性(而不是 ConnectionString 属性),该属性指定要实例化来执行数据操作的对象类型(类名)。类似于 SqlDataSource 的命令属性, ObjectDataSource 控件支持诸如 SelectMethod UpdateMethod InsertMethod DeleteMethod 的属性,用于指定要调用来执行这些数据操作的关联类型的方法。本节介绍一些方法,用于构建数据访问层和业务逻辑层组件并通过 ObjectDataSource 控件公开这些组件。
 DataKeyNamesOldValuesParameterFormatString
1 DataKeyNames
如果读者使用 Simple_ObjectDataSource.aspx ,可以发现如果没有设置 GridView DataKeynames 属性,则无法更新或者删除操作。
Update Delete 操作中扮演特殊角色的一个重要属性是 DataKeyNames 属性。此属性通常被设置为数据源中字段的名称,这些字段是用于匹配该数据源中的给定行的主键的一部分。当以声明方式指定此属性时,多个键之间用逗号分隔,尽管通常情况下只有一个主键字段。
为了保留原始值以传递给 Update Delete 操作, DataKeyNames 属性指定的字段的值在视图状态中往返,即使该字段并未作为 GridView 控件中的列之一被呈现。当 GridView 调用数据源 Update Delete 操作时,它在一个特殊的 Keys 字典中将这些字段的值传递给数据源,该字典独立于包含用户在行处于编辑模式时(对于更新操作)输入的新值的 Values 字典。 Values 字典的内容是从为处于编辑模式的行呈现的输入控件中获得的。
例如,假设数据库里由如下一条记录
ProductID     ProductName   CategoryID     Price         InStore     Description
24             生物技术           7             9.0000         2           生物技术丛书
为了进行数据传递,在实际执行该行的编辑时, ASP.NET 框架将以 Key/Value 字典的形式进行存储的,这里我们将它写成如下的方式以便理解:
key                     value
{"@ProductID"   ,           "24"     }
{"@ProductName",          " 生物技术 "}
{"@CategoryID",            "7"      }
{"@price",                   "9.0000"}
{"@InStore",                "2"      }
{"@Description",             " 生物技术丛书 "}
然而我们知道在数据库里 productID 是递增的主键,所以在实际更新中,该行并不需要进行更新,若要排除此字典中的该字段,我们可以在 GridView 的绑定列中设置该列为只读。当将 Columns 集合中的对应 BoundField ReadOnly 属性设置为 true 时,该字段将不会在 key/value 里传递。另一方面还请注意,默认的如果在 Visual Studio 中使用 GridView 设计器,主键字段的 ReadOnly 属性会自动设置为 true
由于我们在前面的演示里已经将 ProductID 设置为已经将 ProductID 设置为 ReadOnly true ,自然的传递到 UpdateProduct Key/Value 的值为:
{"@ProductName",          " 生物技术 "}
{"@CategoryID",            "7"      }
{"@price",                   "9.0000"}
{"@InStore",                "2"      }
{"@Description",             " 生物技术丛书 "}
这里可以看到没有了 @ProductID 列,那么系统如何知道你当前编辑的 ProductID 呢?这个功能就是由 DataKeyNames 来完成。原来当您将 GridView DataKeyNames 设置为 ProductID 时,该列在更新时会自动调用 ProductID 的数值。
这是因为 GridView 和其他数据绑定控件调用 Update 操作的自动功能需依赖此命名约定才能工作。参数的命名预期应与 SelectCommand 返回的关联字段值相同。使用此命名约定使得数据绑定控件传递给数据源的值与 SQL Update 语句中的参数相对应成为可能。
此默认命名约定的使用假设 Keys Values 字典的内容相互排斥 -- 即用户能够在数据绑定控件处于编辑模式时更新的字段值的命名应该与用于匹配要更新的行的字段值(对于 SqlDataSource ,这些字段值在 WHERE 子句中)的命名不同。考虑这点的另一种方式是在 DataKeyNames 上设置的任何字段都应该设置为只读或在数据绑定控件中(例如在 GridView Columns 集合中)不可见。虽然键字段为只读的情况很普遍,但是存在一些有效的方案,其中您将希望能够更新同时还用于匹配要更新的数据行的字段。
例如,如果我们将 Products 数据库的 ProductID 列在设计表格结构时设置为 nvarchar ,它存放的是图书 ISDN 编号,该编号并不是递增的,因此在运行时,您可以更改 ProductID 的只,前提是主要不重复即可。
这样我们就需要将该 ProductID 列设置为 ReadOnly=”false” 以便允许编辑,另一方面,为了确认哪条记录被更新还需要传递该列的只到更新 / 删除方法,所以还需要将 DataKeyNames 设置为 ProductID
这样 GridView 将在 Keys 字典中传递该字段的旧值,而在 Values 字典中传递该字段的新值。仍以 UpdateProduct 为例,当将 ProductID ReadOnly 设置为 ”false” ,并且将 DataKeyNames 设置为 ProductID 后,对于前面介绍的这条记录
ProductID     ProductName   CategoryID     Price         InStore     Description
24             生物技术           7             9.0000         2           生物技术丛书
 

你可能感兴趣的:(职场,asp.net,休闲)