以下是本csdn社区的michael_jackson(麦克尔★杰克逊)的贴子(删除了c#部分),放这里我想对大家更有用!
可以使用 ado.net datareader 从数据库中检索只读、只进的数据流。因为每次在内存中始终只有一行,所以使用 datareader 可提高应用程序的性能并减少系统开销。
当创建 command 对象的实例后,可调用 command.executereader 从数据源中检索行,从而创建一个 datareader,如以下示例所示。
[visual basic]
dim myreader as sqldatareader = mycommand.executereader()
使用 datareader 对象的 read 方法可从查询结果中获取行。通过向 datareader 传递列的名称或序号引用,可以访问返回行的每一列。不过,为了实现最佳性能,datareader 提供了一系列方法,它们将使您能够访问其本机数据类型(getdatetime、getdouble、getguid、getint32 等)形式的列值。有关类型化访问器方法的列表,请参阅 oledbdatareader 类和 sqldatareader 类。如果在基础数据类型未知时使用类型化访问器方法,将减少在检索列值时所需的类型转换量。
以下代码示例循环访问一个 datareader 对象,并从每个行中返回两个列。
[visual basic]
do while myreader.read()
console.writeline(vbtab & "{0}" & vbtab & "{1}", myreader.getint32(0), myreader.getstring(1))
loop
myreader.close()
datareader 提供未缓冲的数据流,该数据流使过程逻辑可以有效地按顺序处理从数据源中返回的结果。由于数据不在内存中缓存,所以在检索大量数据时,datareader 是一种适合的选择。
关闭 datareader
每次使用完 datareader 对象后都应调用 close 方法。
如果 command 包含输出参数或返回值,那么在 datareader 关闭之前,将无法访问这些输出参数或返回值。
请注意,当 datareader 打开时,该 datareader 将以独占方式使用 connection。在初始 datareader 关闭之前,将无法对 connection 执行任何命令(包括创建另一个 datareader)。
多个结果集
如果返回的是多个结果集,datareader 会提供 nextresult 方法来按顺序循环访问这些结果集,如以下代码示例所示。
[visual basic]
dim mycmd as sqlcommand = new sqlcommand("select categoryid, categoryname from categories;" & _
"select employeeid, lastname from employees", nwindconn)
nwindconn.open()
dim myreader as sqldatareader = mycmd.executereader()
dim fnextresult as boolean = true
do until not fnextresult
console.writeline(vbtab & myreader.getname(0) & vbtab & myreader.getname(1))
do while myreader.read()
console.writeline(vbtab & myreader.getint32(0) & vbtab & myreader.getstring(1))
loop
fnextresult = myreader.nextresult()
loop
myreader.close()
nwindconn.close()
从 datareader 中获取架构信息
当 datareader 打开时,可以使用 getschematable 方法检索有关当前结果集的架构信息。getschematable 将返回一个填充了行和列的 datatable 对象,这些行和列包含当前结果集的架构信息。对于结果集的每一列,datatable 都将包含一行。架构表行的每一列都映射到在结果集中返回的列的属性,其中 columnname 是属性的名称,而列的值为属性的值。以下代码示例为 datareader 写出架构信息。
[visual basic]
dim schematable as datatable = myreader.getschematable()
dim myrow as datarow
dim mycol as datacolumn
for each myrow in schematable.rows
for each mycol in schematable.columns
console.writeline(mycol.columnname & " = " & myrow(mycol).tostring())
next
console.writeline()
next
ole db 章节
分层行集或章节(ole db 类型 dbtype_hchapter、ado 类型 adchapter)可以使用 oledbdatareader 来检索。当以 datareader 的形式返回包含某章节的查询时,该章节将以此 datareader 中列的形式返回,并公开为 datareader 对象。
ado.net dataset 也可用于通过表间的父子关系来表示分层行集。有关的更多信息,请参阅创建和使用 dataset。
以下代码示例使用 msdatashape 提供程序来为客户列表中的每个客户生成订单的章节列。
[visual basic]
dim nwindconn as oledbconnection = new oledbconnection("provider=msdatashape;data provider=sqloledb;" & _
"data source=localhost;integrated security=sspi;initial catalog=northwind")
dim custcmd as oledbcommand = new oledbcommand("shape {select customerid, companyname from customers} " & _
" append ({select customerid, orderid from orders} as customerorders " & _
" relate customerid to customerid)", nwindconn)
nwindconn.open()
dim custreader as oledbdatareader = custcmd.executereader()
dim orderreader as oledbdatareader
do while custreader.read()
console.writeline("orders for " & custreader.getstring(1)) custreader.getstring(1) = companyname
orderreader = custreader.getvalue(2) custreader.getvalue(2) = orders chapter as datareader
do while orderreader.read()
console.writeline(vbtab & orderreader.getint32(1)) orderreader.getint32(1) = orderid
loop
orderreader.close()
loop
custreader.close()
nwindconn.close()
