-
1 任务三 使用D...
-
2 补充知识
使用DataReader读取数据
通过任务三学习,你需要掌握和了解以下内容:
1.掌握DataReader对象及使用
2.学会制作用户信息更新功能
【任务要点】
DataReader对象及使用
【案例一】
完成用户信息更新页面的制作
前面已经学习了如何将新用户添加到数据库中,学习了如何检索信息,接下来要学习的是如何更新数据。在YiZeShopTest应用程序中,需要更改用户的个人信息——有人来到站点并使用用户名和密码登录网站后,能够在一个页面中看到自己的信息并能够进行修改。实例运行结果如下所示。

ChangeUserInfo页面(用户信息更改页面)
【具体步骤】
(1)打开本项目新建ChangeUserInfo.aspx用户信息更改页面。用户注册页面与用户信息更改页面稍有不同:
①将输入密码的文本框tbPwd和tbPwd1的TextMode(文本框的行为模式)设为“SingleLine”;
②将按钮btnReg的ID属性设为“btnChange”,Text属性设为“更新”;
③页面顶部图片改为“images/ChangeUser.jpg”。
更改后的ChangeUserInfo.aspx窗体如图下所示。
( (2)当该窗体加载的时候,会根据用户登录后保存在Session["user"]中的用户ID检索用户信息,并使用检索出的用户信息来预加载窗体,为了更好的组织代码此时创建一个名为showUserInfo()的私有进程,代码如下:

在之前的5.2的登录页面中登录成功我们需要把用户ID保存在session中。代码如下:

(另一种参考)
自定义的私有进程,执行显示用户信息的操作
showUserInfo的代码如下:

(另一种参考)
(3)在单击【重置】按钮时调用私有进程showUserInfo()重新显示用户信息。
(4)为更新按钮添加事件处理程序,该按钮将负责构建和执行SQL UPDATE语句(该语句将根据用户的ID号更新数据库中的用户信息)。


修改后数据库的结果
(另一种参考)
(5)保存和编译该项目。
【背景知识】
DataReader对象及使用
DataReader对象提供了基于连接的数据存储访问方式,以只向前移动的、只读的格式访问数据源中的数据。很多时候,用户只是希望简单地浏览数据,而不需要以随机的方式(即前后移动或根据索引访问)来访问数据,也不需要更改数据,ADO.NET的DataReader对象是专门为此设计的。因为DataReader只执行读操作,而且每次只在内存中存储一行数据,所以利用DataReader比利用DataSet的速度要快,增强了应用程序的性能,减少了系统的开销。如果要检索大量的数据,且并不需要写数据和随机访问功能,DataReader会是一个很好的选择。
1.DataReader对象的常用方法
(1)Read:该方法使记录指针前进到结果集中的下一个记录中。这个方法必须在读取数据之前调用,以便把记录指针指向第一行。记录指针指向哪条记录,哪条记录即为当前记录。
当Command对象的ExecuteReader方法返回DataReader对象时,当前记录指针指向第一条记录的前面,必须调用Read方法把记录指针移动到第一条记录,然后第一条记录变成当前记录。当移动到最后一条记录时,Read方法将返回值False。只要Read方法的返回值是True,就可以访问当前记录中包含的字段。
(2)GetValue:该方法根据指定列的索引来返回当前记录行的指定字段的值,如GetValue(0)。返回值的类型为Object。
(3)GetValues:把当前记录行中的数据保存一个数组中。可以通过DataReader的FieldCount属性获得字段的数量,从而定义数组的大小。
(4)GetString,GetInt32,GetChar等:这些方法根据指定列的索引,返回当前记录中指定字段的值,返回值的类型由所调用的方法决定。例如,GetChar返回字符型数据。如果把返回值赋予错误的类型变量,将会引发异常。
(5)NextResult:把记录指针移动到下一个结果集,即移动到下一结果集中的第一行之前的位置,如果要选择第一行,仍然必须调用Read方法。在使用Command对象生成DataReader对象时,Command对象的CommandText属性可以指定为用“;”(分号)隔开的多个select语句,这样就可以为DataReader生成多个结果集。
(6)GetDataTypeName:通过输入列索引,获得该列的类型。
(7)GetName:通过输入列索引,获得该列的名称。
(8)IsDBNull:IsDBNull(int i)方法的参数用来指定列的索引号,该方法用来判断指定索引号的列的值是否为空,返回True或False。
(9)Close:关闭DataReader对象。
2.DataReader对象的常用属性
(1)FieldCount:读取当前行中的列数。
(2)HasRows:只读,表示DataReader是否包含一行或多行数据。
(3)IsClosed:读取DataReader是否关闭。
3.DataReader对象的创建与关闭
(1)DataReader对象的创建
DataReader对象的创建可由其构造函数创建,亦可由Command对象(SqlCommand或OleDbCommand类)的ExecuteReader方法创建。若Command对象属于SqlCommand类,则该方法返回的是SqlDataReader对象;若Command对象属于OleDbCommand类,则该方法返回的是OleDbDataReader对象。
在ADO.NET中,一个单一的连接(即一个Connection对象)每次只能打开一个DataReader。如果想要在相同的数据存储区上同时打开两个DataReader类,就必须显式地创建两个连接,每个DataReader各占用一个连接。
(2)DataReader对象的关闭
DataReader是基于连接的数据存储访问方式,即在访问数据的时候,DataReader要求连接一直处于打开状态。如果数据访问的操作可能花费较长的时间,则DataReader必须长时间处于打开状态。因此,底层的连接也必须长时间地保持打开状态。因为DataReader使用底层的连接,在DataReader打开的状态下,不能使用该连接执行其他的任务,即当DataReader打开以后,DataReader就会以独占的方式使用Connection对象,在关闭DataReader以前,将无法对Connection对象执行任何命令。所以,当阅读完数据时或不再使用DataReader时,要记住关闭DataReader。此外,要访问相关Command对象的任何输出参数或返回值时,也必须在关闭DataReader后才可行。

