网站首页  词典首页

请输入您要查询的论文:

 

标题 .NET环境下的DataReader数据查询实现
范文 刘泳文 程国忠


摘 要:DataReader是ADO.NET的一个对象,它通过结合Command对象以一种只读、向前、快速的方式访问数据库。研究了在.NET环境下,使用DataReader实现不同类型的数据查询。
关键词:ADO.NET;DataReader;数据查询
中图分类号:TP301
文献标识码:A 文章编号:1672-7800(2015)005-0047-02
作者简介:刘泳文(1989-),男,广东肇庆人,西华师范大学数学与信息学院硕士研究生,研究方向为计算机辅助教学;程国忠(1963-),男,重庆南川人,西华师范大学数学与信息学院教授、硕士生导师,研究方向为计算机辅助教学。
1 ADO.NET简介
ADO.NET是Microsoft公司新一代.NET数据库的访问架构,是.NET Framework的重要组成部分,ADO是ActiveX Data Objects的缩写[1]。ADO.NET可以实现.NET环境中数据库的访问操作,主要提供面向对象的数据访问架构,用来开发数据库应用程序,是数据源和应用程序之间沟通的桥梁。ADO.NET主要有Connection、Command、DataReader、DataSet和DataAdapter等5个对象,通过这些对象对数据库实现数据操作。
2 DataReader概述
2.1 DataReader特点
DataReader是ADO.NET的重要对象之一,称为数据读出器。DataReader结合Command对象可以实现对数据库中数据的访问。但通过DataReader从数据库中查询数据时只能1次读取1条记录,而且得到的记录是只读的,不能对其进行其它操作,包括更新、删除等。因此,使用DataReader读取数据可以节省内存,这也是其特点之一。DataReader是基于连接的、以只向前的、顺序的方式访问数据,所以当使用DataReader读取一条记录后就不能返回到该记录进行再次读取。因此,DataReader适用于顺序查询大量数据,并且不需要对数据进行更新、删除等操作。
2.2 DataReader常用属性
DataReader的常用属性主要有4个:HasRows、FieldCount、RecordsAffected和IsColsed。
(1)HasRows 属性。用来判断数据库中是否有符合查询条件的数据,返回True或False。
(2)FieldCount属性。得到当前记录中字段的个数,即列数。
(3)RecordsAffected属性。得到执行查询语句所影响的行数。
(4)IsColsed属性。判断DataReader是否关闭,返回True或False。
2.3 DataReader常用方法
DataReader的常用方法有3个:Read、Close和Get[2]。
(1)Read方法。使指针指向下一条记录,当下一条记录可读时,返回True。当返回False时表示当前记录为最后一条,此时指针指向最后一条记录的下一条记录,即为空记录。
(2)Close方法。用来关闭DataReader对象。
(3)Get方法。Get方法包括GetName()、GetString()和GetInt32()等。GetName()用来返回指定列的名称,需要有一个整数参数用来指定返回第几列的名称;GetString()用来返回指定列的字符串类型值,同样需要一个整数参数用来指定第几列;GetInt32()用来返回指定列的整形类型值,也要求用一个整数参数来指定第几列。
3 DataReader对象应用
3.1 DataReader 在.NET环境下的访问数据模型
DataReader对象是一个简单的数据集,由于其具有读取速度快、占用资源少的特点,当只需将数据读出并显示时,其无疑是最佳工具。根据.NET FrameWork数据提供程序不同,DataReader可以分为SqlDataReader、OleDataReader等几种。以SqlDataReader对象为例,读取数据时,应用程序必须一直保持与数据库的连接,其访问数据模型如图1所示。
3.2 DataReader 在.NET环境下的应用实例
本文通过案例介绍DataReader对象的应用。选择ASP.NET结合C#语言开发程序,并以SQL Server2008 为数据库管理系统,建立了名为WebJWDB数据库。库中有Exam表,该表的定义及部分数据如表1、表2所示。
(1)当Exam表中所有记录不存在空字段时,使用DataReader查询Exam所有记录[3],部分语句如下:
string sqlstr = "select * from Exam ";
//创建SQL查询语句,查询Exam表中学生的全部成绩信息。
SqlCommand command = new SqlCommand(sqlstr,connection);
//创建命令对象command。
//通过数据库中的游标来辅助读取查询结果。
SqlDataReader dataReader = command.ExecuteReader();
// 创建数据读出器dataReader并通过执行command的方法获取数据。
if (dataReader.HasRows)//判断数据读出器中是否有数据。
{
while (dataReader.Read()) //通过循环while读出数据。
{
String stuid = dataReader.GetString(0);
String stuname = dataReader.GetString(1);
String gender = dataReader.GetString(2);
String department = dataReader.GetString(3);
int politics =dataReader.GetInt32(4);
int english = dataReader.GetInt32(5);
int maths = dataReader.GetInt32(6);
int computer = dataReader.GetInt32(7);
Response.Write(stuid + "?;?" + stuname + "?;?" + gender + "?;?" + department + "?;?" + politics + "?;?;?;?" + english + "?;?;?;?" + maths + "?;?;?;?" + computer + "?;?;?;?" + "
");}}
(2)当Exam表中的记录存在NULL值字段,且NULL值字段的数据类型在.NET环境中属于引用类型时(数据库中varchar、char等类型在.NET环境中属于引用类型),例如在Exam表中刘斯炎的Department字段为NULL时,使用上述语句查询依然会出错,错误信息为:“System.Data.SqlTypes.SqlNullValueException:数据为空。不能对 Null 值调用此方法或属性”。究其原因在于数据库中的NULL与.NET环境下的NULL不同。在.NET环境中的NULL是表示空引用,若引用类型对象的值为NULL,实际上表示没有对象,相当于引用了一个空对象,所以执行上述代码会出现错误。解决方法如下:在.NET环境下专门使用DBNULL来表示数据库中的NULL,因此在使用DataReader查询的记录中存在空字段时,需要使用IsDBNULL来判断数据库中的值是否为NULL。
因此,在此案例中,应将查询刘斯炎这条记录的语句改为:
//数据库中的数据是NULL与.NET环境下的null不一样。
//数据库中的NULL在.NET下专门使用一个特殊类型来表示:System.DBNULL。
//在数据库中的数据允许为空的,在.NET下查询需要判断。
String department = null;//首先把NULL赋值给department,然后再判断是否为NULL。
if (!dataReader.IsDBNull(3))
{
department=dataReader.GetString(3);
}
(3)当Exam表中的记录存在有NULL值字段,而NULL值字段的数据类型在.NET环境中属于值类型时(数据库中int、datatime等类型在.NET环境中属于值类型),例如在Exam表中王武政的politics字段为NULL时,类似于查询引用类型,同样用IsDBNULL来判断。但不同的是对于值类型不能直接赋值为NULL,它需要借用可空类型(int?)来表示值类型后才可以赋值为NULL。
因此,在此案例中,当王武政的politics字段为NULL时,执行语句改为:
//对于引用类型可以直接赋值null,对于值类型需要借用可空类型int?来表示。
//可空类型只能用于值类型。
int? politics = null;
if (!dataReader.IsDBNull(4))
{
politics=dataReader.GetInt32(4);
}
4 结语
在.NET环境下使用DataReader访问数据时,对于允许为空的字段需要使用IsDBNULL来判断是否为NULL。当查询的数据在.NET环境下为引用类型时可以直接赋值为NULL,但当查询数据在.NET环境下为值类型时则需要借用可空类型来表示值类型。对于Datareader对象,它既有优点也有缺陷,广大程序开发者应根据程序的实际需要来决定是否使用DataReader对象来访问数据。
参考文献:
[1] 支和才.ADO.NET技术研究[J].软件导刊,2011,10(9):121-123.
[2] 徐枫.DataReader与DataSet对象之比较分析[J].现代电子技术,2008(7):185-190.
[3] 邓艺夫.应用DataReader对象实现数据库查询[J].电脑知识与技术,2006(29):122-123.
(责任编辑:孙 娟)
随便看

 

科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。

 

Copyright © 2004-2023 puapp.net All Rights Reserved
更新时间:2024/12/22 23:33:53