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. mysql之SQL入门与提升(二)

    在mysql之SQL入门与提升(一)我们已经有了些许基础,今天继续深化 先造表 SET NAMES utf8;SET FOREIGN_KEY_CHECKS = 0; -- -------------- ...

  2. 压缩归档tar

    一:压缩.解压 1.compress/uncompress/zcat -d:解压 -c:输出到终端,不删除原文件 -v:显示详细信息 2.gzip/ungzip/zcat -d:解压 -c:将压缩或解 ...

  3. 再看thinkphp5分页类使用

    之前使用tp5的分页paginate类时只用到了第一个参数,也就是每页显示多少行 今天又仔细看了下手册和paginate类,发现paginate可传入的参数有很多,可以满足更多需求 比如可以指定分页的 ...

  4. Sublime Text 3 多行游标

    选中要修改的地方ctrl+D ,要跳过不需要修改的选中的就用ctrl+k+d 选中要修改的地方ctrl+D,选中所有要修改的 alt+f3 ctrl+A  ,然后ctrl+shift+L 按住shif ...

  5. WPF 使用 fontawesome

    <Style TargetType="TextBlock" x:Key="tree-icon"> <Style.Setters> < ...

  6. List<Object> 使用Linq

    List<Asset> bdList = allAsset.Where(m => m.Owner.Depts == view.DeptName).ToList(); var quer ...

  7. windows 7 elasticsearch-5.3.2

    # windows elasticsearch- D:\nescafe\elasticsearch-\bin λ java -version java version "1.8.0_121& ...

  8. 【转】《Unity Shader入门精要》冯乐乐著 书中彩图

    为方便个人手机学习时候查阅,从网上转来这些彩图. 如属过当行为,联系本人删除. 勘错表 http://candycat1992.github.io/unity_shaders_book/unity_s ...

  9. kotlin查看编译后的Java代码

    java学一下kotlin,由于用的是同样的jvm,那就说明他们的字节码文件应该是一样的,那么,如果我们能看到编译后的文件,那么学的更快了. 操作 1.打开一个.kt文件 2.在Android Stu ...

  10. svn报错cleanup failed–previous operation has not finished; run cleanup if it was interrupte...

    今天在svn提交的时候它卡顿了一下,我以为已经提交完了,就按了一下,结果就再也恢复不了,也继续不了了... 报错 cleanup failed–previous operation has not f ...