ADO.NET DataReader对象简介

 DataReader 对象

如果我们利用Command 对象所执行的命令是有传回数据的Select 叙述,此时Command 对象
会自动产生一个DataReader 对象。DataReader 是我们写ASP.NET 网页的好朋友,因为我们
常常会将数据源的数据取出后显示给使用者,这时候我们就可以使用DataReader 对象。我们就
可以在执行Execute 方法时传入一个DataReader 型态的变量来接收。DataReader 对象很单纯
的一次只读取一笔纪录,而且只能只读,所以效率很好而且可以降低网络负载。由于Command
对象自动会产生DataReader 对象,所以我们只要宣告一个指到DataReader 对象的变量来接收
即可,并不需要使用New 运算子来产生;另外要注意的是 DataReader 对象只能配合Command对象使用 ,而且DataReader 对象在操作的时候Connection 对象是保持联机的状态。
 
下列程序代码片段传回可以读取Members 数据表中所有的纪录的DataReader 对象:
Dim cmA As ADOCommand= New
ADOCommand("命令字符串","Provider=Microsoft.Jet.OLEDB.4.0;"
& "Data Source=C:\Inetpub\wwwroot\cr\ch05\MyWeb.mdb")
Dim drA as ADODataReader
cmA.ActiveConnection.Open()
cmA.CommandText="Select * From Members"
cmA.Execute(drA)
当我们将DataReader 对象传入Execute 方法后,就可以使用DataReader 对象来读取数据了。
以下为DataReader 常用的属性:
 
属性                                        说明
FieldCount                         只读,表示纪录中有多少字段
HasMoreResults                     表示是否有多个结果,本属性和SQL Script 搭配使用。
HasMoreRows                        只读,表示是否还有资料未读取
IsClosed                           只读,表示DataReader 是否关闭
Item                               只读,本对象是集合对象,以键值(Key)或索引值(Index)的方式取得纪录中某个字段的数据
RowFetchCount                      用来设定一次取回多少笔记录,预设为值为1 笔
 
了解DataReader 对象有什么属性后,我们就可以利用DataReader 所提供的方法来取回资料了。
下表为DataReader 常用的方法:
方法                                          说明
Close                                 将DataReader 对象关闭
GetDataTypeName                       取得指定字段的数据型态
GetName                               取得指定字段的字段名称
GetOrdinal                                取得指定字段名称在纪录中的顺序
GetValue                             取得指定字段的数据
GetValues                                 取得全部字段的数据
IsNull                                    用来判断字段内是否为Null 值
NextResult                                用来和SQL Script 搭配使用,表示取得下一个结果
Read                                  让DataReader 读取下一笔记录,如果有读到数据则传回True,若没有纪录则传回False
Read 方法
在取得Command 对象执行Execute 方法所产生的DataReader 对象后,我们就可以将纪录中
的数据取出使用。DataReader 一开始并没有取回任何数据,所以我们要先使用Read 方法让
DataReader 先读取一笔数据回来。如果DataReader 对象成功取得数据则传回True,若没有取
得资料则传回False。这样一来我们就可以利用Do While...Loop 循环来取得所有的数据,如下
程序所示:
Do While drA.Read()
Response.Write("User Id: " & drA.Item("UserId") & ", Password: ")
Response.Write(drA.Item(1) & "<br>")
Loop
上述程序代码片段利用Read 方法将数据取回后,再利用Item 集合以键值(Key)的方式取出
UserId 字段的数据,以及利用索引值(Index)取得使用者UserPwd 字段的数据;索引值是由0
开始计数,故第一个字段的索引值为0,依此类推。当数据读取完毕后Read 方法会传回False,
所以就跳出循环。
GetValue 方法
我们也可以使用GetValue 方法取得指定字段内的记录,这个方法和Item 属性很像;不过
GetValue 方法的参数只接收索引值,并不接收键值为参数。我们改用GetValue 取得所有字段
内的数据,如下程序所示:
Do While drA.Read()
Response.Write("User Id: " & drA.GetValue(0) & ", Password: ")
Response.Write(drA.GetValue(1) & "<br>")
Loop
GetValues 方法
GetValues 方法是取得字段内所有的记录。这个方法接收一个数组,并且将所有字段填入数组中,如下程序所示:
Dim arValue(drA.FieldCount)
drA.Read() '先抓取一笔记录
drA.GetValues(arValue) '将记录填入数组中
For shtI=0 To drA.FieldCount - 1
Response.Write(drA.GetValue(shtI) & "<br>")
Next
因为索引值是由零开始算,所以我们在使用For...Next 循环的时候记得将结束值减一。
 
GetDataTypeName 以及GetName 方法
GetDataTypeName 方法可以传回指定字段的数据型态,而GetName 方法则是传回指定字段的
字段名称(就是键值)。这两个方法一样以键值或是索引的方式来指定字段。下列程序代码片段
显示每个字段的名称以及数据型态:
Dim shtI As Short
For shtI = 0 To drA.FieldCount - 1
Response.Write("索引值为 " & shtI.ToString & " 的字段, 名称为: " & _
DrA.GetName(shtI) & ", 数据型态: " & DrA.GetDataTypeName(shtI) &
"<br>")
Next
Close 方法
Close 方法可以关闭DataReader 对象和数据源之间的联机。除非把DataReader 对象关闭,否
则当DataReader 对象尚未关闭时,DataReader 所使用的Connection 对象就无法执行其它的
动作。
 
 
综合范例
下列范例在文字输入盒内输入数据表名称,按下确定后程序会将数据表的索引、字段名称、字段
型态以及字段内容全部显示出来:
<%@Import Namespace=System.Data.ADO%>
<%@Import Namespace=System.Data%>
<Html>
<Form Id="F1" Runat="Server">
<Input Id="Text1" Runat="Server" Value="Members"/>
<Button Id="Button1" OnServerClick="Button1_Click"
Runat="Server">执行
</Button>
</Form>
<Script Language="VB" Runat="Server">
Sub Button1_Click(sender As Object, E As EventArgs)
Dim cmA As ADOCommand=New _
ADOCommand("","Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Inetpub\wwwroot\cr\ch05\MyWeb.mdb")
Dim drA As ADODataReader
Dim shtI As Short
cmA.ActiveConnection.Open()
cmA.CommandType=CommandType.TableDirect
cmA.CommandText=Text1.Value
cmA.Execute(drA)
For shtI=0 To drA.FieldCount - 1
Response.Write("字段索引值: " & shtI.ToString & _
" 字段名称: " & drA.GetName(shtI) & _
" 数据型态: " & drA.GetDataTypeName(shtI) & "<br>")
Next
Do While drA.Read()
For shtI=0 To drA.FieldCount-1
Response.Write(drA.GetValue(shtI) & " / ")
Next
Response.Write("<br>")
Loop
End Sub
</SCRIPT>
</Html>

posted on 2011-05-11 15:42  费里曼  阅读(1492)  评论(0编辑  收藏  举报