使用特性

原理图

PS:Read()使指针下移,同时销毁上一条。所以SqlDataReader是只进的。

GetValue()是找当前行中的列

SqlDataReader()特性。

1)只进的  上面原理图描述了。

2)只读的   SqlDataReader只能获取,不能修改。

3)使用SqlDataReader必须保证,Connection的状态是打开的。

因为结果集存储在数据库服务器中,不打开连接是找不到。

读数据的方式

1.reader.GetValue(0)

没有列名的重载。

2.reader[1]

索引器就是用GetValue(0)实现的。

3.reader["列名"]

内部通过GetOrdinal()实现的

//先获取索引
int index = reader.GetOrdinal(columnName);
//再通过索引找到对应的列。
reader.GetValue(index);
/***注意***:reader["列名"]的执行效率非常差,不建议使用。
因为如果这样的语句在循环中,循环多少次,就会执行
多少次没用的 int index = reader.GetOrdinal(columnName);
*/
如果项目中必须使用列名,建议这样用,千万别傻乎乎的写到循环里头。
//把获取列名写在循环外头。
int c1 = reader.GetOrdinal("列名");
while(reader.Read())
{
object obj = reader[c1];
}

获取强类型数据

reader.GetString();
reader.GetINT32();
reader.GetDouble();//数据库里的float,这里要用Double。

为什么要获取强类型呢?

因为Object对象在使用时,要进行一次拆箱,要有性能损耗的。

DataReader读取两个结果集

do{
if(reader.HasRows)
{
while(reader.read())
{ /*读数据*/
}
}
}
//如果有其他结果集,就继续循环!
while(reader.NextResult());

动态的获取强类型

if(reader.HasRows)
{
while(reader.Read())
{ //遍历列
for(int i =;i<reader.FieldCount;i++)
{ //获取数据类型
string dbType =reader.GetDataTypeName(i);
switch(dbType)
{
case "varchar":
case "nvarchar"
case "char":
case "nchar":
reader.GetString(i) ;//简写
break;
case "int":
......
}
}
}
}

IsDBNull

当结果集中的列为null,并且需要用强类型获取时,需要用IsDBNull判断一下。

  string obj = reader.IsDBNull()? "" : reader.GetString();
 

ADO.NET中的DataReader详解的更多相关文章

  1. ADO.NET中的Connection详解

    连接字符串 1.写法一 "Data Source=服务器名; Initial Catalog=数据库; User ID =用户名; Password=密码; Charset=UTF8; &q ...

  2. ADO.NET中的Command详解

    Command方法介绍 1.ExecuteNonQuery 对于Update.Insert.Delete执行并返回受影响行数 对于其他语句返回 -1 2.ExecuteScalar 执行查询.并返回结 ...

  3. Asp.net中GridView使用详解(很全,很经典 转来的)

    Asp.net中GridView使用详解 效果图参考:http://hi.baidu.com/hello%5Fworld%5Fws/album/asp%2Enet中以gv开头的图片 l         ...

  4. Asp.net中GridView使用详解(引)【转】

    Asp.net中GridView使用详解(引) GridView无代码分页排序 GridView选中,编辑,取消,删除 GridView正反双向排序 GridView和下拉菜单DropDownList ...

  5. Asp.net中GridView使用详解(很全,很经典)

    http://blog.csdn.net/hello_world_wusu/article/details/4052844 Asp.net中GridView使用详解 效果图参考:http://hi.b ...

  6. php中关于引用(&)详解

    php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的 ...

  7. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  8. AngularJS select中ngOptions用法详解

    AngularJS select中ngOptions用法详解   一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...

  9. 【转载】C/C++中extern关键字详解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

随机推荐

  1. Redis 发布/订阅机制原理分析

    Redis 通过 PUBLISH. SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能.   这些命令被广泛用于构建即时通信应用,比如网络聊天室(chatroom)和实时广播.实时 ...

  2. 有人向我反馈了一个bug

    我是一个前端开发者,但我想这个故事对任何开发者都会引起共鸣的有人向你反馈了一个 bug. “26 楼会议室的灯亮着.它需要被熄灭.”bug 的备注里写道“你应该能在 5 分钟内搞定,只要按一下开关就好 ...

  3. RSpec自定义matcher

    链接 https://relishapp.com/rspec/rspec-expectations/v/3-4/docs/custom-matchers/define-a-custom-matcher ...

  4. Linux下修改网卡的mac地址

    方法1: # ifconfig ethX down # ifconfig ethX hw ether NEW_MAC_ADDR # ifconfig ethX up 但是这样重启后就失效了,需要再敲一 ...

  5. 认识与学习BASH(中)

    1.在设置变量中:单引号与双引号的最大不同:双引号能保有变量的内容,单引号仅能是一般字符 2.反单引号(`)作用:在一串指令中,在‘之内的指令将会被先执行,其结果将作为外部的输入信息. locate指 ...

  6. [HDU 2546]饭卡 (动态规划)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 题意:见题目 刚开始怎么写都写不对,后来吃饭的时候想了想记忆化搜索的办法 就是说设dp(now, ...

  7. VS2010 MSDN配置

    安装VS2010之后总是要装MSDN的,不然写起程序来还真不方便.前段时间换了电脑后,折腾了好久才把VS和MSDN装好,所以为了方便自己和别人特地把配置MSDN的详细步骤写出来: 1.         ...

  8. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  9. Android框架 加载图片 库 Picasso 的使用简介

    0 说明 现在Android开源库中有许多图片加载框架,本文以picasso为例,总结下开发过程中的一些优化经验,使用的picasso版本如下 compile 'com.squareup.picass ...

  10. RC振荡器与有源滤波器1

    自我总结,有错误欢迎指出! 一.振荡器原理: 对于正反馈,有如下公式: 讨论: 1.当A*F(jw)=1时 Af→∞(物理意义:自激振荡): 2.在f0上,F(jw)相移为0或2n∏:(因此,在f0处 ...