DataReader对象与数据获取

DataReader对象以“基于连接”的方式来访问数据库。

也就是说,在访问数据库、执行SQL操作时,DataReader要求一直连在数据库上。

这将会给数据库的连接负载带来一定的压力,但DataReader对象的工作方式将在很大程度上减轻这种压力。(感觉这不是前后矛盾了?)

DataReader对象的常用属性

DataReader对象提供了用顺序的、只读的方式读取用Command对象获得的数据结果集。

由于DataReader只执行读操作,并且每次只在内存缓冲区里存储结果集中的一条数据,所以使用DataReader对象的效率比较高,如果要查询大量数据,同时不需要随机访问和修改数据,DataReader是优先的选择。

DataReader对象有以下常用属性。

FieldCount属性:该属性用来表示由DataReader得到的一行数据中的字段数。

HasRows属性:该属性用来表示DataReader是否包含数据。

IsClosed属性:该属性用来表示DataReader对象是否关闭。

DataReader对象的常用方法

同样,在SQL Server Data Provider里的DataReader对象叫SqlDataReader,而在OLE DB Data Provider里叫OleDbDataReader。

DataReader对象使用指针的方式来管理所连接的结果集,它的常用方法有关闭方法、读取记录集下一条记录和读取下一个记录集的方法、读取记录集中字段和记录的方法,以及判断记录集是为空的方法。

    1.Close方法

Close方法不带参数,无返回值,用来关闭DataReader对象。

由于DataReader在执行SQL命令时一直要保持同数据库的连接,所以在DataReader对象开启的状态下,该对象所对应的Connection连接对象不能用来执行其他的操作。

所以,在使用完DataReader对象时,一定要使用Close方法关闭该DataReader对象,否则不仅会影响到数据库连接的效率,更会阻止其他对象使用Connection连接对象来访问数据库。

   2.bool Read()方法

bool Read()方法会让记录指针指向本结果集中的下一条记录,返回值是true或false。

当Command的ExecuteReader方法返回DataReader对象后,须用Read方法来获得第一条记录;

当读好一条记录想获得下一下记录时,也可以用Read方法。

如果当前记录已经是最后一条,调用Read方法将返回false。

也就是说,只要该方法返回true,则可以访问当前记录所包含的字段。

    3.bool NextResult()方法

bool NextResult()方法会让记录指针指向下一个结果集。

当调用该方法获得下一个结果集后,依然要用Read方法来开始访问该结果集。

    4.Object GetValue(int i)方法

ObjectGetValue(int i)方法根据传入的列的索引值,返回当前记录行里指定列的值。

由于事先无法预知返回列的数据类型,所以该方法使用Object类型来接收返回数据。

    5.int GetValues(Object[] values)方法

int GetValues(Object[] values)方法会把当前记录行里所有的数据(一条记录)保存到一个数组里并返回。

可以使用FieldCount属性来获知记录里字段的总数,据此定义接收返回值的数组长度。

6.获得指定宇段的方法

获得指定字段的方法有GetString、GetChar、GetInt32等,这些方法都带有一个表示列索引的参数,返回均是Object类型。

用户可以根据字段的类型,通过输入列索引,分别调用上述方法,获得指定列的值。

例如,在数据库里,id的列索引是0,通过

 string id=GetString(0); 

代码可以获得id的值。

    7.返回列的数据类型和列名的方法

可以调用GetDataTypeName()方法,通过输入列索引,获得该列的类型。

这个方法的定义是:

string GetDataTypeName( int i)

可以调用GetName()方法,通过输入列索引,获得该列的名称。

这个方法的定义是:

string GetName(int i); 

综合使用上述两方法,可以获得数据表里列名和列的字段。

   8.bool IsDBNull(int i)方法:

bool IsDBNull(int i)方法的参数用来指定列的索引号,该方法用来判断指定索引号的列的值是否为空,返回Tree或False。

DataReader对象访问数据库代码示例

下面的代码将说明如何利用DataReader对象获得并访问结果集。

//连接字符串
private static string strConnect=" data source=localhost;uid=sa;pwd=aspent;database=LOGINDB"
SqlConnetion objConnection =new SqlConnection(strConnect);
SqlCommand objCommand =new SqlCommand( " ",objConnection);
// 设置查询类的SQL语句
objCommand.CommandText= " SELECT *FROM USERS ";
try
{
//打开数据库连接
  if( objConnection.State == ConnectionState. Closed )
  {
  objConnection.Open();
  }
  //获取运行结果
  SqlDataReader result=objCommand.ExecuteReader();
  //如果DataRead对象成功获得数据,返回true,否则返回false
  If(result.Read()==true)
  {
  //输出结果集中的各个字段
   Response.Write(result["USERID"].ToString());
  Response.Write(result["NICKNAME"].ToString());
   Response.Write(result["USERROLE"].ToString());
  }
}
catch(SqlException e)
{
Response.Write(e.Message.ToString());
}
finally
{
  //关闭数据库连接
  if(objConnection.State == ConnectionState.Open)
  {
  objConnection.Close();
  }
  //关闭DataRead对象
  if(result.IsClosed == false)
  {
  reuslt.Close();
  }
}

DataReader提供未缓冲的数据流,该数据流使过程逻辑可以有效地按顺序处理从数据源中返回的结果。

由于数据不在内存中缓存,所以在检索大量数据时,DataReader是一种适合的选择。

另外值得注意的是,DataReader在读取数据时,限制每次只能读一条,这样无疑提高了读取效率,一般适用于返回结果只有一条数据的情况。

如果返回的是多条记录,就要慎用此对象。

C#与数据库访问技术总结(十三)之DataReader对象的更多相关文章

  1. C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看

    数据库访问技术 ado.net 将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层的数据库访问技术 1.创建数据库,并设置主外键 ...

  2. C#与数据库访问技术总结(十八)

    ADO.NET 代码综合示例 前面已经介绍过OLE DB.NET和SQL Server.NET数据提供者可以用来连接不同的数据源. 以下代码不仅综合演示了使用ADO.NET的这两种数据提供者访问数据库 ...

  3. c# 窗体开发4 数据库访问技术

    ADO.NET的名称起源于ADO(ACTIVEX DATA OBJECTS) USING SYSTEM; USING SYSTEM.COLLECTIONS.GENERIC; USING SYSTEM. ...

  4. 数据库访问技术 odbc dao rdo uda jet oledb

    一.UDA(UniversalDataAccess) 这是微软提供的通用数据访问策略.包括ADO.OLEDB和ODBC.它不光提供了数据库的访 问能力,对于其它的数据存储技术也同样支持,如目录服务.E ...

  5. C#与数据库访问技术总结(十六)之 DataSet对象

    DataSet对象 DataSet对象可以用来存储从数据库查询到的数据结果,由于它在获得数据或更新数据后立即与数据库断开,所以程序员能用此高效地访问和操作数据库. 并且,由于DataSet对象具有离线 ...

  6. C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例

    Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...

  7. C#与数据库访问技术总结(七)综合示例

    综合示例 说明:前面介绍了那么多,光说不练假把式,还是做个实例吧. 表:首先你要准备一张表,这个自己准备吧.我们以学生表为例. 1.ExecuteScalar方法 ExecuteScalar方法执行返 ...

  8. C#与数据库访问技术总结(五)之Command对象的常用方法

    Command对象的常用方法 说明:上篇总结了Command对象的几个数据成员,这节总结Command对象的常用方法. 同样,在不同的数据提供者的内部,Command对象的名称是不同的,在SQL Se ...

  9. ADO.Net 数据库访问技术

    1.在web.Config配置文件中设置连接字符串 <connectionStrings> <add name="connString" connectionSt ...

随机推荐

  1. Lua __index元方法

    [Lua __index元方法] 当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键.如果__ ...

  2. Echarts tooltip文字没有左对齐

    tooltip : { trigger: 'axis', axisPointer : { // 坐标轴指示器,坐标轴触发有效 type : 'shadow' // 默认为直线,可选为:'line' | ...

  3. Swift3.0基础语法学习<五>

    异常处理: // // ViewController5.swift // SwiftBasicDemo // // Created by 思 彭 on 16/11/16. // Copyright © ...

  4. UIWebView使用时的问题,包含修改user agent

    1.①像普通controller那样实现跳转到webview的效果,而不是直接加到当前controller②隐藏webview的某些元素③webview跳往原生app④给webview添加进度条 解决 ...

  5. Unity(三)依赖注入

    Unity具体实现依赖注入包含.属性注入.方法注入. 构造函数注入 public void ConStructorCodeTest1() { //默认注册(无命名),如果后面还有默认注册会覆盖前面的 ...

  6. 【实(dou)力(bi)首(mai)发(meng)】第四次CCF软件能力认证题解

    这次的题总体上相对前三次偏简单.由于实力有限,就分析前四题.     试题编号:    201503-1 试题名称:    图像旋转 时间限制:    5.0s 内存限制:    256.0MB 问题 ...

  7. Eclipse 3.5使用dropins的插件安装方式

    以前安装Eclipse插件有两种方式 1 直接copy插件到features/plugins目录 2 在links目录下创建链接文件. 而 Eclipse 3.5又推出另一种新的安装途径, 更加灵活. ...

  8. mysql提示2002错误的解决方法

    前两天,负责的一个项目出现问题,总是提示"SQLSTATE[HY000] [2002] 由于目标计算机积极拒绝,无法连接",由于负责服务器的同事联系不到,我无法登陆服务器查看原因, ...

  9. windows 硬盘格式不一样的文件移动 导致拒绝访问 权限丢失 0字节解决办法

    解决此问题,必须关闭“简单文件共享”,然后获取文件夹的所有权: 1. 关闭“简单文件共享”: a. 单击“开始”,然后单击“我的电脑”. b. 在“工具”菜单上,单击“文件夹选项”,然后单击“查看”选 ...

  10. 修改ubuntu DNS的步骤(图文)

    有时候连接上VPN服务器后,还是打不开某些网站,这时候,需要对DNS进行更改,一般是修改成为谷歌提供的免费DNS:8.8.8.8  8.8.4.4,在windows下更改比较简单(点击查看“连接上VP ...