当前位置:首页>>在线学习>>net培训

ASP.NET 2.0数据访问和绑定

繁简对译:[]  字体设置:[] 2008-09-27  阅读  次

第三章

ASP.NET 2.0数据访问和绑定

课程目标

q     ADO.NET复习

q     数据绑定表达式

q     常用数据源控件SqlDataSourceObjectDataSourceAccessDataSource等。

q     数据控件GridViewDetailsViewFormViewReportViewDataListRepeater控件、报表控件。

q     模板数据绑定

体验项目——<在线投票系统 >

q  实现了一个简单的投票系统,投票的信息都保存在数据库中,数据库保存投票的项目和项目被投的次数。

q  本系统实现原理是用户每投一票,将在数据库中为所投项目的次数属性加1,最终次数属性值就是此项目的支持数。

ADO.NET简介

qODBCADO数据库的通用接口

qADO.NET的数据模型

ODBCADO数据库的通用接口

qODBC通用接口

qADO通用接口

ODBCADO数据库的通用接口

q 当前市场上存在着数十种不同类型的数据库,常用的有AccessSQL ServerOracleMySQLDB2等。这些数据库分别由不同的公司开发,技术都比较成熟。由于这些数据库采用的数据格式和接口各不相同,因此当应用程序访问它们时,就需要分别编写不同的接口,这种需要给应用程序的设计带来了麻烦。如何来解决这个矛盾呢?解决的方法就是由系统提供各种不同数据库的驱动程序,然后放在应用程序与数据库之间作为中间环节。

q 微软公司提供的通用接口,多年来已经经历了几次大的改进:ODBCOLEDBADOADO.NET

ODBC通用接口

q  ODBCOpen Database Connectivity的缩写,意为开放数据库互连。这是一种用C语言开发的由多种函数组成的应用程序接口(Application Program InterfaceAPI)。这些接口将数据库底层的操作隐藏在ODBC的驱动程序之中。应用程序只需要用统一的接口指向ODBC,然后再由ODBC调用系统提供的驱动程序就能驱动不同类型的数据库。有了这个统一的接口,网站(Windows应用程序)的设计者只需用相同(或相似)的语句即可调用不同类型的数据库了。

q  尽管通过ODBC已经能够驱动大多数常用的数据库,但因为这种编程接口还过于复杂,而且还没有进行优化。所以后来微软又在ODBC的基础上专门针对Access(*.mdb)创建了优化编程接口DAO(Data Access Object,数据访问对象);针对SQL Server数据库,创建了优化编程接口RDO(Remote Data Object,远程数据对象),这种接口还能应用于Oracle数据库。

 ODBC通用接口

 

 

ADO通用接口

q ADO(Active Data Object,动态数据对象)是微软进军Internet后的产品,它是建立在OLE DB技术基础上的接口技术。OLE DBODBC的基础上,用面向对象的思想对ODBC的函数重新进行了分类和包装,形成了一种新的标准。可以说ODBCOLE DB的子类,而OLE DBODBC的基类。利用OLE DB不仅能访问关系型数据库,还能访问非关系型数据(如文件等)

q ADO又对OLE DB的接口进行了优化。ADOODBCOLE DB的上层接口技术。它比RDODAO等接口具有更高的性能、更小的容量及更简便的操作。

q 使用ADO接口几乎能够访问全部常用的数据库,如AccessSQL ServerOracleMySQL等,还能访问非关系型文件。

ADO通用接口

 

 

ADO.NET的数据模型

q数据访问的层次结构

q数据集与数据提供器

ADO.NET的数据模型

q ASP.NET使用ADO.NET数据模型。该模型从ADO发展而来,但它不只是对ADO的改进,而是采用了一种全新的技术。主要表现在以下几个方面:

Ø   ADO.NET不是采用ActiveX技术,而是与.NET框架紧密结合的产物。

Ø   ADO.NET包含对XML标准的完全支持,这对于跨平台交换数据具有十分重要的意义。

Ø   ADO.NET既能在与数据源连接的环境下工作,又能在断开与数据源连接的条件下工作。特别是后者,非常适合于网络应用的需要。因为在网络环境下,保持与数据源连接,不符合网站的要求,不仅效率低,付出的代价高,而且常常会引发由于多个用户同时访问时带来的冲突。因此ADO.NET系统集中主要精力用于解决在断开与数据源连接的条件下数据处理的问题。

数据访问的层次结构

 

 

数据访问的层次结构

q ADO.NET访问数据采用层次结构,其逻辑关系如上图所示。

q 图的顶层代表Web应用层,底层代表各种不同类型的数据源,包括不同类型的数据库、XML文档等。中间是数据层(Data Layer),下面是数据提供器(Provider)。在这个层次结构中,数据提供器起到了关键的作用。

q Provider相当于ADO.NET的通用接口。各种不同的数据提供器对应于不同类型的数据源。每个数据提供器(Provider)相当于一个容器,包括一组类以及相关的命令,它是数据源与数据集(DataSet)之间的桥梁。它可以根据需要将相关的数据读入内存中的数据集,也可以将数据集中的数据返回到数据源。

数据集与数据提供器

 

 

数据集与数据提供器

q ADO.NET中数据集与数据提供器是两个非常重要而又相互关联的核心组件。数据集(DataSet)与数据提供器(Provider)的关系如上图所示。

q 图的左边代表数据集(DataSet),右边代表数据提供器(Provider)

q 数据集是实现ADO.NET断开式连接的核心,从数据源读取的数据先缓存到数据集中,然后被程序或控件调用。数据源可以是数据库或者XML数据。

q 数据提供器用于建立数据源与数据集之间的联系,它能连接各种类型的数据,并能按要求将数据源中的数据提供给数据集,或者从数据集向数据源返回编辑后的数据。

 

数据集(DataSet)31

q  数据集相当于内存中暂存的数据库,不仅可以包括多张数据表,还可以包括数据表之间的关系和约束。允许将不同类型的数据表复制到同一个数据集中(其中某些数据表的数据类型可能需要做一些调整),甚至还允许将数据表与XML文档组合到一起协同操作。

q  数据集从数据源中获取数据以后就断开了与数据源之间的连接。允许在数据集中定义数据约束和表关系,增添、删除和编辑记录,还可以对数据集中的数据进行查询、统计等。当完成了各项数据操作以后,还可以将数据集中的数据送回数据源。

q  数据集的这些特点为满足多层分布式应用的需要跨进了一大步。因为编辑和检索数据都是一些比较繁重的工作,需要跟踪列模式,存储关系数据模型等。如果在连接数据源的条件下完成这些工作,不仅会使总体性能下降,还会影响到可扩展性的问题。

数据集32

q   创建数据集对象的语句是:

      DataSet ds = new DataSet ();  或者  DataSet ds = new DataSet ("表名");

q   在数据集中包括以下几种子类:

      (1)        数据表(DataTable)

      数据表用来存储数据。一个数据集可以包含多张表,每张表又可包含多个行和列。数据表的创建有两种方式:第一,当将数据加载到数据集(DataSet)时,会自动创建一些表(DataTable);第二,以编程方式创建DataTable的对象,然后将这个对象添加到DataSetTables集合中。

      提取数据集中的数据表的语句是:

         DataTable dt = ds.数据表名;

      其中,dt代表数据表对象;ds代表数据集对象。

      (2)        数据行(DataRow)

      数据行是给定数据表中的一行数据,或者说是数据表中的一条记录。它可能代表一个学生、一位用户、一张订单或者一件货物的相关数据。DataRow对象的方法提供了对表中数据的插入、删除、更新和查看等功能。提取数据表中的行的语句如下:

         DataRow dr = dt.Rows[n];

      其中:DataRow代表数据行类;dr是数据行对象;dt代表数据表对象; n代表行的序号(序号从0开始)

数据集33

(3) 数据列(DataColumn)

      数据表中的数据列(又称字段)定义了表的数据结构,例如,可以用它确定列中的数据类型和大小,还可以对其他属性进行设置。例如,确定列中的数据是否是只读的、是否是主键、是否允许空值等;还可以让列在一个初始值的基础上自动增殖,增值的步长还可以自行定义。

      某列的值需要在数据行的基础上进行。语句如下:

      string dc = dr.Columns["字段名"].ToString();

      或者   string dc = dr.Column[index].ToString();

      综合前面的语句,若想取出数据表(dt)中第3条记录中的姓名字段,并将该字段的值放入一输入框(textBox1)中时,语句可以写成:

      DataTable dt = ds.Customers                 // 从数据集中提取数据表

      DataRow dRow = dt.Rows[2 ];                // 从数据表提取行

      string textBox1.Text=dRow["CompanyName"].ToString();  // 从行中取出字段的值

(4) 关系(DataRelation)

      表之间的关系由相关的列定义。在关系型数据库中,关系是指两个表之间外键约束的组合。为了将一张表与另一张表联系起来,可以简单地创建一个DataRelation,它将指出一张表中的哪一列与另一张表中的哪一列相联系。

数据提供器(Provider)

q Provider作为数据集与数据源之间的桥梁,主要任务是建立两者之间的联系。Provider相当于一个容器,包括4种核心类,其类名及其作用如下。

Ø  Connection(连接)类:用于建立与数据源的连接。

Ø  Command(命令)类:用于设置适合于数据源的操作命令,以便执行检索、编辑或输出参数等数据操作。

Ø  DataAdapter(数据适配器)类:每张表对应一个数据适配器,用来向数据集中填入数据,或者从数据集中读出数据。

Ø  DataReader(数据读取)类:用于从数据源向应用程序读取只向前的、只读的、无缓冲的字符流。

 

Connection

qConnection类提供了对数据源连接的封装。类中包含连接方法,以及描述当前连接状态的属性。在Connection类中最重要的属性是ConnectionString。该属性用来指定服务器名称、数据源信息以及其他登录信息。以数据库的连接对象为例,类名为SqlConnection,其创建的语句是:

     SqlConnection sqlConnection1 = new SqlConnection();

     设置ConnectionString属性的语句是:

     sqlConnection1.ConnectionString

     "workstation id=\"CHJ-IQDTYJ8FHYC\";  // 服务器名

     user id=cheng;password=cheng;          // 安全信息

     initial catalog=Northwind;persist security info=False";

     // 数据库名以其他参数

 

Command

qCommand类是对数据源操作命令的封装。对于数据库来说,这些命令既可以是内联的SQL语句,也可以是数据库的存储过程。

qCommand类生成的对象只能在连接的基础上,对连接的数据源指定相应的操作。用来定义操作的语句。例如:

     SqlCommand command1 =

       new SqlCommand("SELECT * FROM Employees",   sqlConnection1);  

     语句将生成一命令对象command1对由sqlConnection1连接的数据源指定检索(SELECT)操作。

DataAdapter

q  数据适配器(DataAdapter)利用连接对象(Connection)连接的数据源,使用命令对象(Command)规定的操作从数据源中检索出数据送往数据集,或者将数据集中经过编辑后的数据送回数据源。

q  数据适配器将数据填入数据集时调用方法Fill(),语句如下:

     dataAdapter1.Fill (dataSet10.Products);

     或者    dataAdapter1.Fill (dataSet11, "Products");

dataAdapter1调用Fill() 方法时将使用与之相关联的命令组件所指定的 SELECT 语句从数据源中检索行。然后将行中的数据添加到 DataSet 中的DataTable 对象中,如果 DataTable 对象不存在,则自动创建该对象。

当执行上述SELECT语句时,与数据库的连接必须有效,但不需要用语句将连接对象打开。如果调用Fill()方法之前与数据库的连接已经关闭,则将自动打开它以检索数据,执行完毕后再自动将其关闭。如果调用Fill()方法之前连接对象已经打开,则检索后继续保持打开状态。

q 一个数据集中可以放置多张数据表。但是每个数据适配器只能够对应于一张数据表。

 

DataReader

q 使用DataReader类可以实现对特定数据源中的数据进行高速、只读、只向前的数据访问。

q 与数据集(dataSet)不同,DataReader是一个依赖于连接的对象。就是说,它只能在与数据源保持连接的状态下工作。因此执行的过程往往是:

    (1)首先打开与数据源的连接;

    (2)调用DataReader类的Read()方法;

    (3)然后关闭与数据源的连接。

 

ASP.NET数据访问概述

q ASP.NET 2.0支持一种用于数据绑定的声明性解决方案,对于大多数常见的数据方案,它根本不需要代码:

    l 选择和显示数据。

    l 对数据进行排序、分页和缓存。

    l 更新、插入和删除数据。

    l 使用运行时参数筛选数据。

    l 使用参数创建主/详细信息方案。

q ASP. NET 2.0引入了两种类型的参与声明性数据绑定模型的两类服务器控件:数据源控件和数据绑定控件。

数据源控件

数据绑定控件

数据绑定表达式

q 使用数据绑定语法,可以将控件属性值绑定到数据,并指定值以对数据进行检索、更新、删除和插入操作。

q 数据绑定表达式包含在<%#%>分隔符之内,可以配合使用EvalBindXPath函数。

q Eval函数用于定义单向(只读)绑定。

q Bind函数用于定义双向(可更新)绑定。

q 除了通过在数据绑定表达式中调用EvalBind方法执行数据绑定外,还可以调用<%#%>分隔符之内的任何公共范围代码,以在页面处理过程中执行该代码并返回一个值。

数据绑定示例

在页面添加一个DataList控件:

      <asp:DataList ID="DataList1" runat="server">

         <ItemTemplate>

         集合中数值为:<%# Container.DataItem %>

         </ItemTemplate>

      </asp:DataList>

……

protected void Page_Load(object sender, EventArgs e)

      {

         ArrayList lists = new ArrayList();

         lists.Add("清华大学");

         lists.Add("清华IT学习认证中心");

         lists.Add("微软中国");

         DataList1.DataSource = lists;

         DataList1.DataBind();

      }

数据控件绑定数据库

q创建数据显示表

q数据排序和分页

q更新和删除数据

q筛选数据

q缓存数据

q/详细信息显示方式

q插入数据

创建数据显示表

q最简单的数据驱动页类型是只读报表,它显示数据但不允许用户操作表示形式或修改数据。

q数据源SqlDataSource控件

q数据控件GridView

 

例:通过向导创建数据显示表

创建数据显示表示例91

1新建Web窗体命名为SqlDataSource1Demo.aspx

2在设计视图中从工具箱中的数据选项卡中拖出一个SqlDataSource控件放入页面或者双击SqlDataSource控件也可。

3)点击智能标记按钮,打开任务窗口,如图所示。

 

 

创建数据显示表示例92

4)点击配置数据源…”,出现配置数据源窗口,在此窗口中的选择您的数据连接中可以选择一个现有的数据连接,或者单击新建连接按钮,会弹出如左图所示的选择数据源对话框窗口,如果曾经创建过数据连接,也可能会直接弹出添加连接对话框,如右图所示。

创建数据显示表示例93

5)在上左图中,根据所需连接数据库的需要,选择连接数据源,不同的数据源,ADO.NET连接所需提供的数据驱动程序是不一样的。这里选择Microsoft SQL Server。点击确定后,弹出上图所示的添加连接对话框。

6)在上右图中的服务器名中输入:.\SQLEXPRESS,注意\旁有个小点,表示本机,就会连接本地上SQLServer2005 Express数据库了。在选择一个数据库项中,下拉选择所需连接的数据库名称,这里选择pubs。点击确定后完成新建连接

7)点击下一步,进入将连接字符串保存到应用程序配置文件中对话框,如图所示。

创建数据显示表示例94

8Visual Studio2005自动生成一个数据库连接字符串上图就是提示是否保存在应用程序的配置文件中。选中是保存,单击下一步。进入配置Select语句,如左图所示。

9)选择要显示的表和字段,这里选择表authors以及全部字段,单击下一步,进入测试查询对话框。

创建数据显示表示例95

10)测试查询没有问题后,点击完成按钮。完成对SqlDataSource控件的数据源配置。实际上会在文件中生成以下代码:

      <asp:SqlDataSource ID="SqlDataSource1" runat="server"

ConnectionString="<%$         ConnectionStrings:pubsConnectionString%>"

         SelectCommand="SELECT * FROM [authors]">

      </asp:SqlDataSource>

Ø    同时在应用程序配置文件Web.Config中,会自动写好连接字符串。

      <?xml version="1.0"?>

      <configuration>

         <appSettings/>

         <connectionStrings>

                   <add name="pubsConnectionString"

                   connectionString="Data Source=.\SQLEXPRESS;

                   Initial Catalog=pubs;Integrated Security=True"

             providerName="System.Data.SqlClient" />

        </connectionStrings>

      </configuration>

创建数据显示表示例96

11从工具箱的数据选项面板中拖入GridView控件进入页面如左图所示。

12)点击智能标记按钮,在选择数据源选项中,下拉选择SqlDataSource1。则数据表就马上发生了变化,如右图所示。

创建数据显示表示例97

13)绑定数据源之后,页面会自动生成以下代码:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"

      DataKeyNames="au_id" DataSourceID="SqlDataSource1">

      <Columns>

         <asp:BoundField DataField="au_id" HeaderText="au_id"

         ReadOnly="True" SortExpression="au_id" />

         <asp:BoundField DataField="au_lname" HeaderText="au_lname"

         SortExpression="au_lname" />

         <asp:BoundField DataField="au_fname" HeaderText="au_fname"

         SortExpression="au_fname" />

         <asp:BoundField DataField="phone" HeaderText="phone"

         SortExpression="phone" />

         <asp:BoundField DataField="address" HeaderText="address"   

                   SortExpression="address" />

         <asp:BoundField DataField="city" HeaderText="city   SortExpression="city" />

         <asp:BoundField DataField="state" HeaderText="state"   SortExpression="state" />

         <asp:BoundField DataField="zip" HeaderText="zip"    SortExpression="zip" />

         <asp:CheckBoxField DataField="contract" HeaderText="contract"  

                    SortExpression="contract" />

         </Columns>

      </asp:GridView>

创建数据显示表示例98

14点击运行或者在浏览器中查看本页面运行结果如图所示。

创建数据显示表示例99

15以上就是通过SqlDataSource数据源控件以页面声明的方式绑定到任何支持SqlDataSource的数据绑定控件。

例如DropDownListListBoxRadioButtonListBulletedListDetailsView等控件。

GridViewColumns集合可添加对象

GridViewColumns集合可添加对象包括:

Ø  BoundField

Ø CheckBoxField

Ø ImageField

Ø HyperLinkField

Ø CommandField

Ø ButtonField

Ø TemplateField

下面示例添加一列HyperLinkField

1)上例中,点击GridView控件的显示智能标记,点击编辑列,进入编辑字段对话框,如左图所示。

2)在左图中,选择BoundField下的au_lnameau_fnamephoneaddresscitystatezip,选择CheckBoxField下的contract添加进来,还选择一个HyperLinkField添加进选定字段中。

3)然后选中添加的HyperLinkField,设置DataTextFieldau_idHeadText编号DataNavigateUrlFieldsau_id,au_fname,具体设置可点击此项属性后的按钮,设置对话框参见右图所示,设置DataNavigateUrlFormatString~/DataBind/AuthorDetail.aspx?uid={0}&fname={1}Target设置为_blank。将各选定字段的HeadText设置为对应的中文标题,

 

4)设置完成后,在浏览器中预览此页面,运行结果如图所示。

 5)在设计视图中,可以右击选择自动套用格式,设置合适的GridView外观的样式。

 

 

6)在上图中,第一列就是一个超链接列,可以链接到另一页,显示详细信息,如图所示。

详细信息显示

1)创建AuthorDetail.aspx页,首先拖入一个SqlDataSource控件,配置数据源过程和前面的过程一样,不过数据连接可以选择已经创建完成的pubsConnectionString,下一步到配置Select语句

2)在配置Select语句对话框中,需要设置Where条件,点击Where(W)…”按钮,弹出添加Where子句对话框,如图所示。

 

3)按上图所示,设置好后,点击添加,然后确定,则Select语句数值为SELECT * FROM [authors] WHERE ([au_id] = @au_id)。在查询测试中,可以输入一个合理的数值,然后测试运行一下。

4)从工具箱中的数据选项中,拖入一个DetailsView控件,设置其数据源为刚才创建的SqlDataSource控件。通过智能标记菜单中的编辑字段,将字段列表的标题换成对应的中文标题,具体操作方法和GridView编辑字段一样。可以通过自动套用格式设置一种显示风格。

5)运行后,显示的结果如上例所示。

绑定数据源模式说明

q 如果通过SqlDataSource控件只是读取数据,而不需要排序、编辑等操作,可以让SqlDataSource控件的数据源模式(DataSourceMode)为DataReader

q 通过将SqlDataSourceMode属性设置为DataReader,可以配置SqlDataSource控件将数据作为DataReader返回。

q 当只需对数据进行仅向前、只读访问时,使用DataReader一般比使用DataSet具有更好的性能。

q 但是要注意SqlDataSource的排序功能在此模式下将被禁用。

数据排序和分页

qGridView控件相对于其他数据绑定控件的关键优点之一是其自动利用数据源功能的能力。

q对数据进行手动排序和分页,GridView控件能够自动执行这些操作

q需要将数据源配置为支持这些操作,当SqlDataSource控件的DataSourceMode属性设置为DataSet时支持排序。

启用排序

q 若要在GridView中启用排序UI,选中智能标记菜单中的启用排序,或者在HTML代码将AllowSorting属性设置为true

q 设置列字段与GridView控件的SortExpression 属性关联,也即SortExpression被设置为与GridView的某列关联的单个字段名称。

启用分页21

qGridView控件还通过选中智能标记中的启用分页,或者在HTML代码中将AllowPaging属性设置为true

qGridView能够对从数据源返回的任何支持ICollection接口的值自动进行分页

启用分页22

q 在设置分页后,还可以通过属性窗口

Ø  设置GridView控件的PageSize(每页显示大小)

Ø  可以设置PagerStyle中的HorizontalAlignCenter来使页码标签显示在脚注的中间

Ø  通过分别配置PagerStylePagerSettings属性,还可以自定义页导航的样式和设置。

Ø  PagerStyle确定页导航的外观和风格,而PagerSettings确定要使用的分页类型(数字或Next/Previous(下一页/上一页)按钮)、页导航位置和相关选项。

更新和删除数据

q 通过UpdateDelete操作,GridView控件还能够自动呈现用于修改数据的UI,只要关联的数据源被配置为支持这些功能。

q SqlDataSource控件在其UpdateCommandDeleteCommand属性分别设置为有效的更新或删除命令或存储过程时分别支持Update操作和Delete操作。

q UpdateCommandDeleteCommand应该包含用于GridView控件将传递的每个值的参数占位符。还可以指定一个UpdateParametersDeleteParameters集合以设置每个参数的属性,例如参数数据类型、输入/输出方向或默认值。

更新和删除数据

 

qGridView控件和SqlDataSource数据源控件配合实现更新和删除功能,具体参见以下设置过程:

1)选中SqlDataSource控件,首先设置UpdateQuery属性,弹出命令及参数编辑器对话框,如图所示

 

2)可以点击查询生成器来生成查询语句,弹出添加表对话框,如左图所示。

3)添加数据表authors,在列编辑需要更新的数值字段,请注意Update语句中的参数的命名约定。参数的命名预期应与SelectCommand返回的关联字段值相同。

UPDATE authors SET au_lname = @au_lname, au_fname = @au_fname, phone = @phone, address = @address, city = @city, state = @state, zip = @zip,contract = @contract    WHERE (au_id = @au_id)

注意@参数名需要和SqlDataSource控件的Select语句返回的字段名相同。

 

4编辑完SelectQuery属性后然后再编辑DeleteQuery属性语句为

     DELETE FROM authors WHERE (au_id = @au_id)

5)点击GridView控件智能标记菜单中的添加列,弹出添加字段对话框,在对话框中将选择字段类型设置为:CommandField,命令按钮选中删除编辑和更新,如右图所示。

 

6)点击确定后,则GridView会自动多出两列编辑删除列。选中编辑列,点击智能标记中的左移列,将编辑列移动到第一列。如图所示。

7)因为考虑到pubs数据库中authors表和库中其他表存在的主外键约束,可能有些数据无法删除,所以先向authors插入两条纪录。

 

8)运行本页或者在浏览器中查看本页,选择最后一页,点击某行编辑按钮,进入GridView编辑状态。

9)在修改文本框的数值,点击更新按钮可以更新数据库数值,当然如果无需修改可以取消

10)在数据列表状态也可以删除数据,选择刚才插入的一条数值,点击删除按钮,就可以把本条数据删除。

 

运行结果参见示例

DataKeyNames属性

q  UpdateDelete操作中扮演特殊角色的一个重要属性是DataKeyNames属性。

q  此属性通常被设置为数据源中字段的名称,这些字段是用于匹配该数据源中的给定行的主键的一部分。

q  当以声明方式指定此属性时,多个键之间用逗号分隔,虽然通常只有一个主键字段。

q  为了保留原始值以传递给UpdateDelete操作,DataKeyNames属性指定的字段的值在视图状态中往返,即使该字段并未作为GridView控件中的列之一被呈现。

q  GridView调用数据源UpdateDelete操作时,它在一个特殊的Keys字典中将这些字段的值传递给数据源,该字典独立于包含用户在行处于编辑模式时(对于更新操作)输入的新值的Values字典。

筛选数据

q数据驱动页中的一种常见方案是筛选报表中数据的能力。

 

 

SqlDataSource数据参数来源21

qSqlDataSource控件的数据参数,可以有多个来源,配置数据参数以便从以下任意来源检索值。

SqlDataSource数据参数来源22

缓存数据

q  数据源控件的具备一个功能是自动缓存数据的能力。

q  尽管可以使用缓存API以编程方式缓存数据,但是设置数据源控件的一些声明性属性可以达到相同的结果。若要对SqlDataSource控件(以及将讨论的ObjectDataSource)启用缓存,请将EnableCaching属性设置为true

q  设置CacheDuratio属性指定要在缓存中存储项的时间长度(以秒为单位)。

q  可以将CacheExpirationPolicy属性设置为SlidingAbsolute

q  DataSourceMode属性设置为DataSet时,缓存仅在SqlDataSource控件上受支持。

缓存数据示例

/详细信息显示方式(DetailsView 控件)

q/详细信息通常是指这样一种控件安排,其中一个控件(控件)中的选定记录在另一个控件(详细信息控件)中显示选定记录的附加详细信息。

 

编辑记录的DetailsView

1)可以使用AutoGenerateEditButtonCommandField.ShowEditButton属性启用该编辑UI

2)在上例基础上,设置绑定到DetailsView1数据源控件SqldataSource3UpdateQuery为:

    UPDATE authors

      SET au_lname = @au_lname, au_fname = @au_fname, phone = @phone,

      address = @address, city = @city, state = @state, zip = @zip, contract = @contract

      WHERE au_id=@au_id

3通过DetailsView1的智能标记中的添加新字段添加CommandField类型的编辑/更新

不同的页中使用主/详细信息方案

插入数据

SqlDataSource的局限

q前面课程演示和讲解了将控件绑定到SqlDataSourceSqlDataSource支持用于指定连接字符串、SQL语句或存储过程的属性,用以查询或修改数据库。

q以上方式适合大多数小规模的个人或业余站点,但对于较大规模的企业级应用程序,在应用程序的呈现页中直接存储SQL语句可能很快就会变得无法维护。

ObjectDataSource控件 21

q对于较大规模的企业级应用程序,不能在应用程序的呈现页中直接存储SQL语句。这些应用程序通常需要用中间层、数据访问层或业务组件构成封装性更好的数据模型。

q因此在ASP.NET2.0数据源控件模型使用的ObjectDataSource控件支持这种方式。

ObjectDataSource控件 22

q ObjectDataSource公开一个 TypeName属性而不是ConnectionString属性),该属性指定要实例化来执行数据操作的对象类型类名

q 类似于SqlDataSource的命令属性ObjectDataSource控件支持诸如SelectMethodUpdateMethodInsertMethodDeleteMethod的属性用于指定要调用来执行这些数据操作的关联类型的方法。

绑定到数据访问层

q 典型的数据访问层组件可按如下方式公开:

      public class CustomDataLayer {

         public DataView GetRecords();

         public DataView GetRecordsByName(String categoryName);

         public DataView GetRecordByID(int recordID);

         public int UpdateRecord(int recordID, String recordData);

         public int DeleteRecord(int recordID);

         public int InsertRecord(int recordID, String recordData);

      }

q ObjectDataSource 可以通过属性或者代码按照如下方式关联到该类型:

 

         <asp:ObjectDataSource TypeName="CustomDataLayer"

         SelectMethod="GetRecords"  UpdateMethod="UpdateRecord"

         DeleteMethod="DeleteRecord" InsertMethod="InsertRecord"

         runat="server"/>

ObjectDataSource示例21

//中间层部分代码

using System;

using System.Data;

using System.Collections.Generic;

 

namespace TsinghuaIt

{

public class Author

    {

        public String ID { ...  }

        public String Name { ...  }

        public String LastName { ...  }

         public String State { ... }

        public Author(String id, String name, String lastName, String state){ ... }

        public Author(){ ...}

    }

    public class AuthorsBlock

    {

        public AuthorsBlock(){ ... }

        public List<Author> GetAuthorsByState(String state, String sortExpression)

        { ... }

        public int UpdateAuthor(string ID, string LastName, string Name, string State)

        { ... }

        public int UpdateAuthor(Author a) { ... }

        public List<String> GetStates(){ ... }

    }

    public class AuthorComparer : IComparer<Author>

    { ... }

}

ObjectDataSource示例22

相关设置

1ObjectDataSource2绑定DropDownList1控件设置ObjectDataSource2TypeNameTsinghuaIt.AuthorsDataSelectMethodGetStatesAuthorData类中方法

 

2设置DropDownList1DataSourceIDObjectDataSource2DataTextFieldDataValueField都为state

 

3ObjectDataSource1绑定GridView1控件设置ObjectDataSource1TypeNameTsinghuaIt.AuthorsDataSelectMethodGetAuthorsByState因为有参数需设置SelectParameters参数名称为state对应值为DropDownList1.SelectValue默认值为CA。因为涉及到更新数据,所以还要设置UpdateMethodUpdateAuthorUpdateParameters中添加四个参数名为au_idau_fnameau_lnamestate,对应数值部分为空。

 

4)设置GridView1控件的DataSourceIDbjectDataSource1DataKeyNamesau_id

 数据绑定表达式

q  ASP.NET2.0改进了模板中的数据绑定,DataBinder.Eval(Container.DataItem, fieldname)简化为Eval(fieldname)

q  Eval方法也接受一个可选的formatString参数。

q  Eval仅在数据绑定控件的模板中使用,而不能在级别使用。

q  ASP.NET2.0页继续支持DataBinder.Eval,因此它可用于简化的Eval语法不受支持的场合。 

例如:

      <asp:DataList DataSourceID="ObjectDataSource1" runat="server">

         <ItemTemplate>

                   <asp:Image ImageUrl='<%# Eval("FileName",

                   "images/thumbs/{0}") %>' runat="server"/>

                   <asp:Label Text='<%# Eval("Caption") %>' runat="server"/>

         </ItemTemplate>

      </asp:DataList>

 

DataList控件

qDataList Web服务器控件以某种格式显示数据,这种格式可以使用模板和样式进行定义。

qDataList控件可用于任何重复结构中的数据。如表,DataList控件可以以不同的布局显示行,如按列或行对数据进行排序。

DataList模板示例

q运行结果

q设计视图

 

DataList控件支持的模板类型

DataList事件

q  响应列表项中的按钮单击而引发。这些事件旨在帮助开发人员响应DataList控件的最常用功能。支持该类型的四个事件:

      l EditCommand

      l DeleteCommand

      l UpdateCommand

      l CancelCommand

q  若要引发这些事件可将ButtonLinkButtonImageButton控件添加到DataList控件中的模板中并将这些按钮的CommandName属性设置为某个关键字editdeleteupdatecancel。当用户单击项中的某个按钮时,就会向该按钮的容器(DataList控件)发送事件。按钮具体引发哪个事件将取决于所单击按钮的CommandName属性的值。例如,如果某个按钮的CommandName属性设置为edit,则单击该按钮时将引发EditCommand事件。如果CommandName属性设置为delete,则单击该按钮将引发DeleteCommand事件,依此类推。

FormView控件

qFormView控件在任意形式的模板中一次呈现单个数据项。

qFormView控件使用数据源中的单个记录,该控件与DetailsView控件相似。

qDetailsViewFormView之间的主要差异在于DetailsView具有内置的表格呈现方式,而FormView需要用户定义的模板用于呈现。FormViewDetailsView对象模型在其他方面非常类似。

FormView控件示例

q运行结果

q设计视图

Repeater 服务器控件

qRepeater服务器控件类似于DataList服务器控件,通过创建模板为Repeater服务器控件提供布局。

q如果未定义模板,或者如果模板都不包含元素,则该控件不会显示在页面上。

qRepeater服务器控件能够支持的模板有ItemTemplateAlternatingItemTemplateHeaderTemplateFooterTemplateSeparatorTemplate

q该控件模板编辑参见DataList

其他数据源控件

q AccessDataSource控件

    使用Access数据库作为数据源

    SqlDataSource数据源控件一样使用SQL语句执行数据的查询、更新、修改等操作

    使用DataFile属性直接指定Access数据库的位置

q  XmlDataSource控件

    XmlDataSource数据源控件是为数据绑定控件提供XML类型的数据源。

    数据绑定控件可以使用该控件显示分层数据和表格数据。

    DataFile属性指定的XML文件中加载XML数据

q SiteMapDataSource控件

    提供分层的数据源,或者叫作站点地图数据的数据源,常用来为ASP.NET导航控件(如TreeViewMenu控件)提供数据源。

    SiteMapDataSource使那些并非专门作为站点导航控件的Web服务器控件(如TreeViewMenuDropDownList控件)能够绑定到分层的站点地图数据。

 

ReportViewer服务器控件

qReportViewer控件是具有报表设计功能和用于显示报表。

q用来呈现表格格式的数据、聚合数据和多维数据,它可以以图表形式显示数据。

q支持的图表有柱形图、条形图、折线图、饼图、散点图、气泡图、面积图、圆环图和股价图。

q报表还可以导出Excel文件和PDF文件。

ReportViewer服务器控件示例

本章总结

qADO.NET简介

q数据绑定表达式

q常用数据源控件SqlDataSourceObjectDataSourceAccessDataSource等。

q数据控件GridViewDetailsViewFormViewReportViewDataListRepeater控件、报表控件。

q模板数据绑定

 

 

打印 收藏 关闭