第十四讲 DataReader对象的使用教学目的:
一,DataReader对象的属性和方法二,在线处理数据教学重点:
一、复习 Command类的对象的使用 ;
二、掌握 DataReader类的对象的使用 ;
三、总结在线处理数据的方式 ;
一,Command对象复习 (两个属性、
三个方法 )
Command对象可用来存放要对 SQL Server数据库执行的一个 T-SQL语句或存储过程,并能执行该 T-SQL语句或存储过程,利用
Command对象可直接对数据库进行处理,
1,Command对象的创建
以下语句建立 Command,根据习惯不同,可以使用以下三种方法,
SqlCommand cmd=new SqlCommand
(“select * from users”,conn);
SqlCommand cmd=conn.CreateCommand();
cmd.CommandText=“select * from users”;
SqlCommand cmd=new SqlCommand(); //创建连接对象
cmd.Connection=conn; //连接属性
cmd.CommandText=”select * from users”; //命令文本属性
2,Command对象的使用
以上代码创建了命令类的对象,但并没有执行 SQL语句命令,现在我们来看到底怎样执行,
主要有三个执行方法,
ExecuteNonQuery( ):针对 insert,update,delete类型的 SQL语句的执行,无返回结果集,函数返回值为影响的记录的行数,
ExecuteReader( ):针对 select类型的 SQL语句的执行,
返回一个结果集的函数,函数返回值为一个 DataReader
类的对象,
ExecuteScalar( ):针对 select类型的 SQL语句的执行,
返回一个单一值,
☆ 使用 Command对象的三个步骤:
1、创建 Command对象
2、将 Command对象与 Connection对象关联
Command.Connection=conn
3、设置 Command对象的 CommandText属性
3,总结:在线处理数据的方式
XxxDataReader
连接对象命令对象 XxxCommand
XxxConnection
数据库应用程序使用数据读取器
Select类型命令,
调用 ExecuteReader()
Insert,update,delete类型命令,
调用 ExecuteNonQuery()
应用程序使用想想修改数据的三步曲是
三步曲是,
一、建立连接 二、建立命令 三、执行命令
SqlConnection conn=new SqlConnection();
conn.ConnectionString=“server=.;database=classmates;
user id=abc;password=123”;
SqlCommand cmd=new SqlCommand();
cmd.Connection=conn;
cmd.CommandText=“delete from records where 性别 =?女’” ;
conn.Open()
cmd.ExecuteNonQuery();
conn.Close();
特别注意:根据需要 写出 sql语句
Insert into 表名 (字面列表 ) values(值列表 )
update 表名 set 实现目的 where 条件
delete from 表名 where 条件
Select 字段列表 from 表名 where 条件
C o n n e c t i o n C o m m a n d
D a t a A d a p t e r
D a t a R e a d e r
D a t a S e t
C o n n e c t i o n C o m m a n d
D a t a A d a p t e r
D a t a R e a d e r
D a t a S e t
数 据 库二,DataReader对象
DataReader(数据读取器类),此类对象帮助我们以 单向的,只读的,向前的方式读取数据库中的数据。
DataReader虽然不如 DataSet强大,但是在很多情况下我们需要的是 灵活的读取数据而不是大量的在内存里面缓存数据 。 比如在网络上每个用户都缓存大量的 DataSet,这很可能导致服务器内存不足。另外 DataReader尤其适合快速读取数据,
因为它不在内存中缓存大量数据 。
1,创建 DataReader对象
注意:没有构造函数创建 DataReader对象 。
通常我们使用 Command类的 ExecuteRader方法来创建 DataReader对象:
SqlDataReader
dr=cmd.ExecuteReader() ;
在任何时候都必须使用这种方法来创建!!!
DataReader类最常见的用法就是读取 Sql
查询或者存储过程返回的记录 。它是 连接的 只 向前 和 只读 的结果集,也就是使用它时,数据库连接必须保持打开状态,
另外 只能从前往后遍历信息,不能中途停下修改数据 。
★★ 注意:使用完 DataReader后一定记得关闭阅读器和连接。
dr.Close()!!!
2,DataReader的属性和方法属性
FieldCount:只读,表示纪录中有多少字段
HasMoreResults:表示是否有多个结果,本属性和 SQL Script 搭配使用。
HasMoreRows:只读,表示是否还有资料未读取
IsClosed,只读,表示 DataReader是否关闭
Item,只读,本对象是集合对象,以键值( Key)
或索引值( Index)的方式取得纪录中某个字段的数据
RowFetchCount:用来设定一次取回多少笔记录,
预设为值为 1 笔
方法
Close,将 DataReader 对象关闭
GetDataTypeName:取得指定字段的数据型态
GetName:取得指定字段的字段名称
GetOrdinal:取得指定字段名称在纪录中的顺序
GetValue,取得指定字段的数据
GetValues,取得全部字段的数据
IsNull:用来判断字段内是否为 Null 值
NextResult,用来和 SQL Script 搭配使用,表示取得下一个结果
Read,让 DataReader 读取下一笔记录,如果有读到数据则传回 True,若没有纪录则传回 False
下面就 DataReader对象的几个重要方法作进一步的解释说明:
Read 方法在取得 Command 对象执行 Execute 方法所产生的 DataReader 对象后,我们就可以将纪录中的数据取出使用。 DataReader 一开始并没有取回任何数据,所以我们要先使用 Read 方法让 DataReader 先读取一笔数据回来。 注意:该方法的返回值为布尔型!! 如果 DataReader 对象成功取得数据则传回 True,若没有取得资料则传回 False。
这样一来我们就可以利用 While循环来取得所有的数据,如下程序所示:
While drA.Read()
{
Response.Write("User Id," &
drA.Item("UserId") & ",
Password,")
Response.Write(drA.Item(1) &
"<br>")
}
上述程序代码片段利用 Read 方法将数据取回后,再利用 Item 集合以键值( Key)的方式取出 UserId 字段的数据,以及利用索引值( Index)取得使用者 UserPwd 字段的数据; 索引值是由 0开始计数,故第一个字段的索引值为 0,依此类推。当数据读取完毕后 Read 方法会传回 False,所以就跳出循环。
GetValue 方法我们也可以使用 GetValue 方法取得指定字段内的记录,这个方法和 Item 属性很像;
不过 GetValue 方法的参数只接收索引值,
并不接收键值为参数。 我们改用 GetValue
取得所有字段内的数据,如下程序所示:
While drA.Read()
{
Response.Write("User Id," &
drA.GetValue(0) & ",Password,
")
Response.Write(drA.GetValue(1)
& "<br>")
}
NextResult()方法如果返回的是多个结果集,DataReader 会提供 NextResult 方法来按顺序循环访问这些结果集
SqlCommand myCMD = new SqlCommand("SELECT CategoryID,
CategoryName FROM Categories;" +"SELECT EmployeeID,
LastName FROM Employees",nwindConn);
nwindConn.Open();
SqlDataReader myReader = myCMD.ExecuteReader();
do
{
Console.WriteLine("\t{0}\t{1}",myReader.GetName(0),
myReader.GetName(1));
while (myReader.Read())
Console.WriteLine("\t{0}\t{1}",myReader.GetInt32(0),
myReader.GetString(1));
} while (myReader.NextResult());
myReader.Close();
nwindConn.Close();
Close 方法
Close 方法可以关闭 DataReader 对象和数据源之间的联机。除非把 DataReader 对象关闭,否则当 DataReader 对象尚未关闭时,
DataReader 所使用的 Connection 对象就无法执行其它的动作。
★使用 DataReader对象后,必须调用此方法关闭 DataReader对象以释放资源!!
3,遍历 DataReader中的记录
当执行 ExecuteReader方法创建了 DataReader对象时,当前光标的位置在第一条记录的前面。
必须调用 数据读取器 的 Read方法 把光标移动到第一条记录,然后第一条记录就是当前记录。
如果当前有记录,Read方法返回一个 bool值
true。 也就是说 Read方法的作用是在允许范围内移动光标位置到下一记录。 如果当前光标已经指示到最后一条记录了,此时再调用 Read方法得到 false。
为了读取所有记录,我们经常这样做(循环读取):
While(dr.Read ())
{
//处理当前记录
}
注意,如果你对每一条记录的操作可能花费比较长的时间,那么意味着阅读器将长时间打开,
那么数据库连接也将维持长时间的打开状态。
此时使用非连接的 DataSet会更好一些 。
4,访问读取到的每条记录中各字段的值有 2种方法。
第一种是“属性形式”,使用对象及其 字段索引 或者 字段名字 来获取 对应的字段的值。
第二种是 Get方法,此方法返回有字段索引指定的字段的值。
每个 DataReader类都定义一个 Item属性。比如现在我们有一个 DataReader实例 dr,对应的
sql语句是 select Fid,Fname from friend,
则我们可以使用下面的方法取得返回的值:
object ID = dr[“Fid”];
object Name = dr[“Fname”];
或者:
object ID = dr[0];
object Name = dr[1];
4.1 属性形式 获取当前记录中各字段的值
注意索引总是从 0开始的 。 另外也许你发现了我们使用的是 object来定义 ID和 Name,
是的,Item属性返回的值是 object型,但是你可以强制类型转换。
int ID = (int)dr[“Fid”];
string Name = (string)dr[“Fname”];
记住:确保类型转换的有效性是你自己的责任,否则您将得到异常。
每个 DataReader都定义了一组 Get方法。同上面的例子一样我们用如下方式访问 Fid和 Fname的值:
int ID = dr.GetInt32(0);
string Name = dr.GetString(1);
注意虽然这些方法把数据从数据源类型转化为,net
数据类型,但是他们不执行其他的数据转换,比如他们不会把 16位整数转换为 32位的。所以你必须使用正确的 Get方法。另外 Get方法不能使用字段名来访问字段,
4.2 Get方法 获取当前记录中各字段的值小结:在线读数据的方式
XxxDataReader
连接对象命令对象 XxxCommand
XxxConnection
数据库应用程序使用数据读取器
Select类型命令,
调用 ExecuteReader()
在线读数据分哪四步?
在线读数据四步曲,
1)建立连接
2)建立命令
3)执行命令
4)读取数据第一个实例,控制台应用程序连接数据库,并显示数据。
第二个实例:用 DataReader类处理登陆表单
Text 登陆窗体
StartPosition CenterScreen
MaxmizeBox false
MinimizeBox fase
controlBox fase
AcceptButton button1
password *
3 在线处理数据总结
灵活运用三个类( Connection Command
DataReader)的对象的使用,完成应用程序对数据的读取与添加修改或删除 。
总结:在线处理数据的方式(连接模式)
XxxDataReader
连接对象命令对象 XxxCommand
XxxConnection
数据库应用程序使用数据读取器
Select类型命令 Insert,update,delete类型命令应用程序使用注意:
1)此图为连接模式或在线模式处理数据的方式。
此种方式在对数据库中的数据执行添加、修改、
删除或是读取的时候,要求应用程序一直与服务器连接,不能中断。
优点是速度快,缺点是读取数据的时候有限制。
每次只能读取一条记录,并且只能单向的向前读取记录。当应用程序需要读取大量数据的时候,
或者不规则的使用读取到的数据的时候,最好采用 DataSet离线处理数据模式。在网页中常常使用 DataSet方式读取数据,