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. SP1716 GSS3

    题意翻译 \(n\) 个数,\(q\) 次操作 操作\(0\) \(x\) \(y\)把\(A_x\) 修改为\(y\) 操作\(1\) \(l\) \(r\)询问区间\([l, r]\)的最大子段和 ...

  2. 2017ACM/ICPC广西邀请赛

    A.A Math Problem #include <bits/stdc++.h> using namespace std; typedef long long ll; inline ll ...

  3. JMeter - 连续性能测试 - JMeter + ANT + Jenkins集成 - 第2部分

    目标: 创建包含性能测试流程的持续交付管道,以尽早检测任何与性能相关的问题. 通常,全面的性能测试将在分段/预生产环境中完成,该环境可能与您的生产环境相同.在完成QA功能/回归验证后,将代码推送到分段 ...

  4. vs获取最新时,提示签出解决方案

    项目中的文件有被意外去掉了只读属性的. VSS中签入状态的文件在本地都有只读属性. 如果VSS中是签入状态,而对应的本机文件没有只读状态,在获取最新版本的时候,就会弹出一个对话框提示签出还是用VSS中 ...

  5. sql数据库发布、订阅同步方式操作

    Sql数据库发布订阅分为两个步骤:1.发布.2.订阅.首先在数据源数据库服务器上对需要同步的数据进行发布,然后在目标数据库服务器上对上述发布进行订阅. 一.发布. 发布需要用实际的服务器名称,不能使用 ...

  6. vs2017 运行所选代码生成器时出错

    [转]https://blog.csdn.net/sunshineyang1205/article/details/80211313 ASPNET MVC Core中像Controller中添加控制器 ...

  7. ThinkPHP- 3.1

    基础: 1. 基础概念 LAMP LAMP是基于Linux,Apache,MySQL和PHP的开放资源网络开发平台.这个术语来自欧洲,在那里这些程序常用来作为一种标准开发环境.名字来源于每个程序的第一 ...

  8. SpringBoot | 第三章:springboot配置详解

    基于springboot的约定优于配置的原则,在多数情况下,启动一个应用时,基本上无需做太多的配置,应用就能正常启动.但在大部分开发环境下,添加额外配置是无所避免的,比如自定义应用端口号(比较在机器比 ...

  9. Spring整合Struts2 注解版

    1.jar包 <!--spring配置--> <dependency> <groupId>org.springframework</groupId> & ...

  10. HTTP缓存技术,304和200有何区别

    为什么有的缓存是 200 OK (from cache),有的缓存是 304 Not Modified 呢?很简单,看运维是否移除了 Entity Tag.移除了,就总是 200 OK (from c ...