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. jenkins相关下载链接

    Jenkins官网:https://jenkins.io/ 下载rpm安装包:   https://pkg.jenkins.io     http://mirrors.jenkins-ci.org/s ...

  2. 20165224 陆艺杰 Exp 8 Web基础

    .基础问题回答 (1)什么是表单 html的一个控件 表单在网页中主要负责数据采集功能 (2)浏览器可以解析运行什么语言 html xml jsp php python 等 (3)WebServer支 ...

  3. JavaScript和jquery中的宽度

    Javascript: 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document ...

  4. Unity 动画系统目录

    引言 提到动画,你想到的是什么? 图片在循环播放构成的动画.UI物体的循环变色.2D 3D物体在循环运动.链条弹簧的运动.3D的玩家在行走奔跑挥剑.非人形的运动... 动画实现方式的分类 动画实现的方 ...

  5. Base64Utils

    package com.yundaex.common.crypto.base64; import java.io.ByteArrayInputStream; import java.io.ByteAr ...

  6. OSI七层和TCP/IP四层的关系、TCP与UDP、HTTP、Socket

    HTTP(应用层协议):超文本传输协议,HTTP协议是建立在TCP协议之上的一种应用. HTTP协议详细解释 2Http详解 TCP(面向连接的传输层协议):transmission control ...

  7. 002 Add Two Numbers 链表上的两数相加

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  8. HDU 4143 A Simple Problem 分解因式

    求一个最小的正整数x,使得(y + x) (y - x) = n成立 考虑一下n的分解因式. 可能会想到枚举n的约数,那么a * b = n成立,取最小的x即可 但是要枚举到n / 2,这样会超时. ...

  9. 关于SQL Server数据库中的标识列

    一.标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列. 该种列具有以下三种特点: 1.列的数据类型为不带小数的数值类型 2.在进行插入(Insert)操作时,该列的值 ...

  10. enable orgmode latex preview to support retina on mac

    Table of Contents 1. enable orgmode latex preview to support retina on mac 1.1. get the proper versi ...