1、前言
使用SqlDataReader较之SqlDataAdapter速度上快,因为读取记录是一行一行的来,但是往往也感觉那么蹩脚。例如经常用到的如何从SqlDataReader中获取DataRow呢?下面给出以下几种方法。

2、DataSet.Load方法
首先使用DataSet.Load(pSqlDataReader, LoadOption.Upsert, "")将数据载入。再使用pDataSet.Tables[0].Rows[0]取出说要的DataRow值,如下:
       private DataRow GetDataRow(SqlDataReader pSqlDataReader)
        {
            DataRow pDataRow = null;
            DataSet pDataSet = new DataSet();
            DataTable pDataTable = m_DataRow.Table.Clone();
            pDataSet.Load(pSqlDataReader, LoadOption.Upsert, pDataTable.TableName);
            if (pDataSet.Tables[0].Rows.Count != 0)
            {
                pDataRow = pDataSet.Tables[0].Rows[0];
            }
            return pDataRow;
        }
该方法经常会出现数值转换错误:如nvarchar 值 '123456789011' 的转换溢出了 int 列。超出了最大整数值。需要用户自己做排错处理。

3、DataTable.Load方法
方法的原理同上,先使用pDataTable.Load(pSqlDataReader, LoadOption.Upsert, null)将数据装入DataTable,然后使用pDataTable.Rows[0]获取DataRow的值。代码如下:

private DataRow GetDataRow(SqlDataReader pSqlDataReader)
        {
            DataRow pDataRow = null;
            DataSet pDataSet = new DataSet();
            DataTable pDataTable = m_DataRow.Table.Clone();
            pDataTable.Rows.Clear();
            pDataTable.Load(pSqlDataReader, LoadOption.Upsert, null);
            if (pDataTable.Rows.Count != 0)
            {
                pDataRow = pDataTable.Rows[0];
            }
            return pDataRow;
        }
同样如果数据不符合则出现上面的错误。

4、SqlDataReader.GetValue和DataTable.LoadDataRow方法
首先使用pSqlDataReader.GetValues(Values)将数据输出到数组Values中,然后通过pDataTable.LoadDataRow(Values, false)将数据装入DataTable,最后使用pDataRow = pDataTable.Rows[0]取出需要的值。代码如下:

private DataRow GetDataRow(SqlDataReader pSqlDataReader)
        {
            DataRow pDataRow = null;
            DataSet pDataSet = new DataSet();
            DataTable pDataTable = m_DataRow.Table.Clone();
            object[] Values = new object[pDataTable.Columns.Count];
            pSqlDataReader.GetValues(Values);
            pDataTable.LoadDataRow(Values, false);
            if (pDataTable.Rows.Count != 0)
            {
                pDataRow = pDataTable.Rows[0];
            }
            return pDataRow;
        }

5、SqlDataReader.GetValues和DataRow.ItemArray = Values方法

该方法使用上面的原理,首先使用pSqlDataReader.GetValues(Values)将数据输出到数组Values中,然后定义一个DataRow,使用DataRow.ItemArray = Values方法对DataRow进行赋值,代码如下:

private DataRow GetDataRow1(SqlDataReader pSqlDataReader)
        {
            DataSet pDataSet = new DataSet();
            DataRow pDataRow = m_DataRow.Table.NewRow();
            object[] Values = new object[m_DataRow.Table.Columns.Count];
            pSqlDataReader.GetValues(Values);
            pDataRow.ItemArray = Values;
            return pDataRow;
        }
注意由于新定义的DataRow没有字段信息,需要对DataRow的列字段进行定义,定义一个空的符合数据要求的DataRow,使用DataTable.NewRow();,然后就可以使用该方法pDataRow.ItemArray = Values进行赋值。该方法效率高。

6、总结
本文建议使用最后一种方法,效率高且转换安全。

如何从SqlDataReader中获取DataRow的更多相关文章

  1. 如何在获取Datarow对象在其所属DataTable中的Index

    做项目的时候需要先select一个DataTable的子集,后来又需要子集中这些DataRow的Index, 这个需求本来就有些奇怪,网上也没搜到.刚开始走了很多弯路,后来发现一个简便方法 'dr是你 ...

  2. GridView控件RowDataBound事件中获取列字段值的几种途径

    前台: <asp:TemplateField HeaderText="充值总额|账号余额"> <ItemTemplate> <asp:Label ID ...

  3. 浅谈ESB中的DataRow、DataSet、DataBag 、DataBox

    1 背景概述 笔者在学习公司产品AEAI ESB 的时候经常需要从数据库获取信息并将数据信息保存到一个结果变量中,为统计分析提供特定格式的数据以及跨数据库同步数据时通常会用到DataRow.DataS ...

  4. C# -- 等待异步操作执行完成的方式 C# -- 使用委托 delegate 执行异步操作 JavaScript -- 原型:prototype的使用 DBHelper类连接数据库 MVC View中获取action、controller、area名称、参数

    C# -- 等待异步操作执行完成的方式 C# -- 等待异步操作执行完成的方式 1. 等待异步操作的完成,代码实现: class Program { static void Main(string[] ...

  5. nodejs中获取时间戳、时间差

    Nodejs中获取时间戳的方法有很多种,例如: new Date().getTime() Date.now() process.uptime() process.hrtime() 平时想获取一个时间戳 ...

  6. 记录一次bug解决过程:velocity中获取url中的参数

    一.总结 在Webx的Velocity中获取url中参数:$rundata.getRequest().getParameter('userId') 在Webx项目中,防止CSRF攻击(Cross-si ...

  7. [UWP]UWP中获取联系人/邮件发送/SMS消息发送操作

    这篇博客将介绍如何在UWP程序中获取联系人/邮件发送/SMS发送的基础操作. 1. 获取联系人 UWP中联系人获取需要引入Windows.ApplicationModel.Contacts名称空间. ...

  8. Android Studio中获取SHA1或MD5的方法

    原来在Eclipse中获取SHA1或者MD5,在IDE界面上就可以查找到. 切换到Android Studio后,如何查看呢?找了半天没找到.那就老办法命令行. 第一步.打开Android Studi ...

  9. Android中获取选择图片与获取拍照返回结果差异

    导语: 如今的安卓应用在选择图片的处理上大多合并使用拍照和从相册中选择这两种方式 今天在写一个这样的功能时遇到一个尴尬的问题,同样是拍照获取图片功能,在不同手机上运行的效果不一样,下面是在某型手机上测 ...

随机推荐

  1. 开源库SRT编译指南

    SRT(Secure,Reliable,Transport)是Haivision公司开发的一套开源媒体传输协议,用于在不稳定的网络环境下,优化媒体数据的传输性能.  SRT的码流加密基于开源库open ...

  2. myeclipse集成svn客户端

    转载大神 https://blog.csdn.net/tandeng19901222/article/details/5979075

  3. Storm概念学习系列 之Worker工作者进程

    不多说,直接上干货! Worker工作者进程   工作者进程(Worker)是一个java进程,执行拓扑的一部分任务.一个Worker进程执行一个Topology的子集,它会启动一个或多个Execut ...

  4. java字符串与二进制的相互转化

    public class StrBinaryTurn { // 将Unicode字符串转换成bool型数组 public boolean[] StrToBool(String input) { boo ...

  5. HDU 5496——Beauty of Sequence——————【考虑局部】

    Beauty of Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  6. C#语言使用习惯

    1.使用属性而不是可访问的数据成员 2.用运行时常量(readonly)而不是编译期常量(const) 编译期常量与运行时常量行为的不同之处在于对他们的访问方式不同,编译期常量的值是在目标代码中进行替 ...

  7. 字符串实现Base64加密/解密

    有时候需要对字符串进行加密,不以明文显示,可以使用此方法,比如对URL的参数加密 using System; using System.Collections.Generic; using Syste ...

  8. devExpress GridControl gridView笔记

    gridView1.Appearance.EvenRow.BackColor = Color.FromArgb(, , , ); gridView1.Appearance.OddRow.BackCol ...

  9. [Freemarker] Getting Start

    Freemarker是一个模板引擎,在.NET中有类似的T4模板,FreeMarker对ASP.NET MVC也很友好,链接地址,引用官方的一幅图 模板+数据=视图 Following are the ...

  10. spring transaction 初识

    spring 事务初识 1.spring事务的主要接口,首先盗图一张,展示出spring 事务的相关接口.Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给Hibern ...