使用特性

原理图

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. js跳转页面方法整理

    1.window.location.href方式 window.location.href="http://www.zgw8.com"; 2.window.navigate方式跳转 ...

  2. Laravel5.0 CSRFチェックを無効化(修改后可以像5.1以上那样从CSRF保护中排除指定URL)

    Laravel5では全てのPOSTに勝手にCSRFチェックが付いてきます.便利と言えば便利ですが.Laravel外からのPOSTを受け取りたいときなど大迷惑です. CSRFチェックを排除する方法が何故 ...

  3. 94、EventBus框架 ---- 转载

    EventBus使用之基础 http://blog.csdn.net/yanbober/article/details/45667363 EventBus框架库代码走读  http://blog.cs ...

  4. [ActionScript 3.0] AS3 判断字符串是否为数字

    trace(isNaN(Number("0")));//false trace(isNaN(Number("123")));//false trace(isNa ...

  5. shell 统计 awk

    time awk '{a[$1]++}END{for(i in a){printf("%d\t%s\n",a[i],i)}}' access.log | sort -nr | he ...

  6. sql server 根据执行计划查询耗时操作

    with QS as( select cp.objtype as object_type, /*类型*/ db_name(st.dbid) as [database], /*数据库*/ object_ ...

  7. Python第九章模块和包

    1.import Python文件的时候文件名不能跟Python中自带的关键字重复,否则无法使用关键字的方法. 2.Reload(),重载例子 import sysreload(sys)sys.set ...

  8. Python安装Selenium3

    概述 2016.10.13,Selenium3.0正式发布,官方说明如下: The major change in Selenium 3.0 is we're removing the origina ...

  9. 接口自动化的根基--HTTP协议

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  10. 浅谈Java的包装类

    一.什么是Java包装类 所谓Java包装类,就是将Java中的8种基本数据类型分别包装成为类的形式.包装类与基本数据类型的对应关系如下表所示. 基本数据类型 包装类 byte Byte short ...