zoukankan      html  css  js  c++  java
  • 如何从SqlDataReader中获取DataRow

    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、总结
    本文建议使用最后一种方法,效率高且转换安全。

  • 相关阅读:
    位运算(转自matrix67)
    STL学习之priority_queue适配器
    asp.net_缓存管理
    Tomcat安装配置
    CSS选择器(中)——高级选择器
    CSS选择器(下)——高级选择器再续
    Oracle学习记录——使用自定义函数和触发器实现主键动态生成
    Oracle安装配置—64位Win7安装配置64位Oracle
    CSS选择器(中)——高级选择器续
    Windows7操作系统自定义运行命令(简单方法之二)
  • 原文地址:https://www.cnblogs.com/kennyliu/p/3644882.html
Copyright © 2011-2022 走看看