接着ADO.NET的记忆碎片(一)继续
Command类在执行SQL的时候,可能会遇到一次执行多条SQL的情况,就像这样:

string strConn ="...";//连接字符串
string strSql = "update tableName1 set...;"+"update tableName2 set...;";
SqlConnection cn = new SqlConnection(strConn);
cn.Open();
SqlCommand cmd = new SqlCommand(strSql,cn);
int intTotalRowsAffected = cmd.ExecuteNonQuery();//返回的是多条SQl语句影响的总行数

可以看到返回的是影响数据库表的总行数,这并不是我们想要的结果,解决的方法是在每次执行一条SQL语句完成的时候就能返回一个数据给我,这才是我想的。好在ADO.NET2.0提供了我们这样的获取机会,在Command中公开了一个StatementCompleted事件,这个事件是在每一条SQL语句执行完成后促发的,并且事件的主要参数中提供了RecordCount属性,就是表示这次SQL语句的执行对数据库表所产生的行数的影响。实现该功能如下:

string strConn ="...";//连接字符串
string strSql = "update tableName1 set...;"+"update tableName2 set...;";
SqlConnection cn = new SqlConnection(strConn);
cn.Open();
SqlCommand cmd = new SqlCommand(strSql,cn);
cmd.StatementCompleted += new StatementCompletedEventHandler(HandleStatementCompleted);
int intTotalRowsAffected = cmd.ExecuteNonQuery();//返回的是多条SQl语句影响的总行数
cn.Close();
...
static void HandleStatementCompleted(object sender,StatementCompletedEventArgs e)
{
    Console.WriteLine(e.RecordCount);
}

DataReader类

前面其实已经多次使用了DataReader,在此做一回顾:
当一个Command对象执行ExecuteReader()方法返回值就是一个DataReader类型的实例,保存着查询的结果集。代码如下:

SqlDataReader rdr = cmd.ExecuteReader();

对查询的结果集遍历:

while(rdr.Read())
{
    Console.WriteLine("{0}--{1}",rdr[0],rdr["CustomerName"]);   
}
rdr.Close();

好了,下面对DataReader类进行进一步的研究,很多时候我们得到结果集,但是想看看里面的字段的数目、字段名称、字段的Net类型、字段的数据库数据类型等,这一些架构信息可以帮助我们更好的扩展应用程序,ADO.NET也帮助我们实现了方法我们可以自由的调用:

for(int intField=0;intField<rdr.FieldCount;intField++)//FieldCount是读取字段数量的属性
{
    Console.WriteLine(intField);
    Console.WriteLine(rdr.GetName(intField));//获取字段名称,参数是该字段的索引
    Console.WriteLine(rdr.GetFieldType(intField).Name);//获取net数据类型,参数是该字段的索引
    Console.WriteLine(rdr.GetDataTypeName(intField));//获取数据库数据类型,参数是该字段的索引
    Console.WriteLine();
}
rdr.Close();

知道了字段名称怎么确定字段的索引,可以使用GetOrdinal()方法:

int fieldInt = rdr.GetOrdinal("CustomerName");//返回CustomerName这个字段的索引

用基于序号的查阅字段内容比基于字段名称查阅性能好,所有就是因为这个原因有时候GetOrdinal()是非常受欢迎的。
原来是:

while(rdr.Read())
{
    Console.WriteLine("{0}--{1}",rdr[0],rdr["CustomerName"]);   
}
rdr.Close();

可以改成:

int fieldInt = rdr.GetOrdinal("CustomerName");
while(rdr.Read())
{
    Console.WriteLine("{0}",rdr[fieldInt]);   
}
rdr.Close();

这样性能就可以得到提升,其实这段代码的性能还可以进一步的提升。

强类型的getter

其实目前我们使用的rdr[0]基于索引的取值,其实是返回一个object类型的数值,但是我们本来的字段的类型是多样的,有:int,string,datetime等,这样其实里面会有一个类型转换的问题,术语是会“装箱”和“拆箱”,这是很影响性能的,解决的办法就是使用强类型的getter,里面定义了许多net数据类型的公开Get(),如:GetString(),GetInt32()  ,GetDateTime().代码可以改变如下:

int fieldInt = rdr.GetOrdinal("CustomerName");
while(rdr.Read())
{
    Console.WriteLine("{0}",rdr.GetString(fieldInt));   
}
rdr.Close();

在开发过程中,如果不能确定字段的类型,请尝试调用GetFieldType().
处理来自查询的多个结果集
很多时候我们一次查询会返回多个select结果,但是用DataRead实例中的Read()方法只能访问第一个结果集,要访问其他的结果集要调用NextResult()方法。代码:

do
{
    while(rdr.Read())
   {
        Console.WriteLine("{0}",rdr.GetString(fieldInt));   
   }
}while(rdr.NextResult());

转载于:https://www.cnblogs.com/lmfeng/archive/2011/12/01/2270982.html

ADO.NET的记忆碎片(二)相关推荐

  1. ADO.NET的记忆碎片(六)

    校验DataSet中的数据 数据库提供了很多的机制使数据是有效的.ADO.NET的DataSet提供了许多可在数据库系统中使用的相同的数据效验机制.一般可以将这些效验的机制分成两类:列级别的限制和表级 ...

  2. ADO.NET的记忆碎片(七)

    使用DataTable类的搜索和筛选功能 DataTable类公开了两个方法:Find和Select Find方法:可以根据主键来查找数据行.Select方法:更类似于筛选器,根据更灵活的搜索条件返回 ...

  3. flash基本操作二-库面板和元件创建

    flash基本操作二-库面板和元件创建 在上一篇文章: flash基本操作中,我们详细讲解了制作逐帧动画的过程.本人最近用flash制作广告,对此非常的感兴趣,在本次的文章当中我们将继续介绍库面板和元 ...

  4. VC++网络资源集合

    http://www.jizhuomi.com/software/257.html     第一部分:VS2010/MFC开发环境     第二部分:VS2010/MFC应用程序框架     第三部分 ...

  5. VB课本基础知识总结

    一.概述: Visual Basic是一种面向对象的可视化程序设计语言,采取了事件驱动的编程机制. VB程序的两种运行方式:解释方式运行,编译方式运行. 对象:世间万物皆为对象:VB中所有可见的界面元 ...

  6. 一个简单仓库管理系统的设计与实现--需求篇

    去年12月份,帮助一个老乡完成了一份大作业,使用VB+ACCESS实现一个简单的仓库管理系统,现做一下总结并进一步完善,分为三部分:需求.设计.实现. 需求篇 项目需求: 一.控件技术要求: 1.Ac ...

  7. Delphi 原生ADO(二)

    我发现很多朋友在开发数据库时都使用 Delphi 自带的 ADO 组 件 或 Diamond ADO,其实在 Delphi 中使用原生 ADO 接口也是十分方便和有效的.我使用原生 ADO 开发项目已 ...

  8. ADO.Net的小知识(连接数据库)二

    上次提到数据库连接有两种形式断开式连接和打开式连接,断开式连接我已经讲解了,下面我来给大家讲解一下打开式连接 (1)引入命名空间:using System.Data.SqlClient; 该语句用于导 ...

  9. ASP.NET MVC + ADO.NET EF 项目实战(二):设计过程与设计工具

    工欲善其事,必先利其器.好的工具能够成倍提升工作效率.ASP.NET MVC和ADO.NET EF也是因为其工具出色而受到欢迎.例如: MVC所提供的View模板工具: MVC所提供的View切换.向 ...

最新文章

  1. Lumen报class does not exist的mailer坑
  2. 用html怎么 显示直线,html怎么用鼠标画出一条直线,鼠标移动时候要能看到线条...
  3. RocketMQ 介绍 msgId生成算法
  4. 开源版本_重磅!阿里开源 OpenJDK 长期支持版本 Alibaba Dragonwell
  5. 通过script标签实现跨域
  6. 深度技术 GHOST XP SP3 快速专业装机版 v2012.07
  7. HTML页面显示缩略所有空格为一格的方法
  8. [收藏] 微软850位顶级人才不做Windows研发
  9. python管道通信_Python进程通信之匿名管道实例讲解
  10. 计算机基本的应用是,计算机统考应用基础练习题
  11. [置顶] SPL讲解(6)--Condition篇
  12. Binaural Microphone
  13. wcdma系统随机接入过程的流程图_随机接入过程
  14. 基于WebRTC搭建直播系统源码
  15. android 脱壳 加固,安卓的脱壳之战-爱加密加固
  16. 学习平面设计有哪些前途
  17. 定位首款弹幕K歌软件 阿里鲸鸣未来究竟能够走多远?
  18. 昔日的手游大作,《无尽之剑》系列如今为何走向英雄末路?
  19. 如何用好示波器?资深工程师也会忽略这些细节……
  20. 陶陶摘苹果//C语言

热门文章

  1. 可以不封神,但是不能不修炼——亚特兰蒂斯之神特斯拉的启示
  2. Exchange Server 2019新功能预览-揭秘被削减的功能
  3. Facebook推开源软件平台ParlAI,能否解决机器人灵魂缺失问题?
  4. PostgreSQL数据库服务端监听设置及客户端连接方法教程
  5. 用 Python 拓展 GDB(三)
  6. systemback-----做你折腾的后盾
  7. Android 监听 Android中监听系统网络连接打开或者关闭的实现代码
  8. X64 Linux 无法从本地字符界面登陆。
  9. 一个简单的Ajax开发框架
  10. Nessus Scan