声明式数据绑定教程-ObjectDataSource

作者:vkvi 来源:ITPOW(原创) 日期:2008-8-10

前面使用的数据源都是 SqlDataSource,我们可以看到在页面中直接调用了 SQL 语句,也就是说将表现层和数据访问层是混在一起的,这不利于架构的清晰,所以我们使用 ObjectDataSource 将数据访问层独立出来。

使用 ObjectDataSource 不会影响 GridView 和 DetailsView 的代码,我们先添加一个 ObjectDataSource。

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    TypeName="Cftea.Demo.Doc"
    EnablePaging="true"
    SelectCountMethod="GetDocsCount"
    SelectMethod="GetDocsList"
    InsertMethod="InsertDoc"
    UpdateMethod="ModifyDoc"
    DeleteMethod="DeleteDoc">
</asp:ObjectDataSource>
  • TypeName 指定一个类名,如果有名称空间,要加上名称空间。
  • EnablePaging 表示是否需要分页。
  • SelectCountMethod 表示类中选取总记录数的方法名称。
  • SelectMethod 表示类中选取当前分页记录集的方法名称。
  • InsertMethod 表示插入记录的方法名称。
  • UpdateMethod 表示更新记录的方法名称。
  • DeleteMethod 表示删除记录的方法名称。

现在我们就需要来简单说说这个类。

namespace Cftea.Demo
{
    public static class Doc
    {
        public static int GetDocsCount()
        {
            string sql = @"select count(*) from cftea_docs";
            //执行这个 sql,获得记录总数
            return ...
        }
       
        public static DataView GetDocsList(int startRowIndex, int maximumRows)
        {
            //
        }
       
        public static void InsertDoc(string title, string content, int categoryId)
        {
            //
        }
       
        public static void ModifyDoc(int id, string title, string content, int categoryId)
        {
            //
        }
       
        public static void DeleteDoc(int id)
        {
            //
        }
    }
}

具体实现方法就不写了,请参见 ADO.NET 对象介绍连载文章。我们使用的是静态类,如果使用非静态类,也能正常运行,只是每次它会自动创建并销毁实例,和静态类相比,这要花费一点不必要的开销。

要说明的是 GetDocsList(int startRowIndex, int maximumRows),这里面有两个参数,如果 ObjectDataSource 的 EnablePaging 为 false,就应该去掉这两个参数。而如果要改变参数名称,就得在 ObjectDataSource 中,利用 StartRowIndexParameterName、MaximumRowsParameterName 指定你定义的参数名称。

  • startRowIndex 当前页第一条记录的索引,其值为:页大小*(当前页数-1)。
  • maximumRows 页大小,即一页的记录数,是设定的记录数,不是实际有多少记录(一般来说最后一页的记录数都小于设定的记录数)。

二者的值由 GridView 自动传过来,也就是说要先设定 GridView 为可以分页。利用二者可以只取当前页的记录,性能很高,速度也很快,这就解决了前面说的性能问题。关于此分页,请参考数据库分页连载。

更高级的方式请参见手工实现 RowCommand、RowDeleting、RowEditing、RowUpdating、RowCancelingEdit

相关阅读

相关文章