如何从SqlDataReader中获取DataRow

如何从SqlDataReader中获取DataRow,第1张

1、前言

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

2、DataSetLoad方法

首先使用DataSetLoad(pSqlDataReader, LoadOptionUpsert, "")将数据载入。再使用pDataSetTables[0]Rows[0]取出说要的DataRow值,如下:

private DataRow GetDataRow(SqlDataReader pSqlDataReader)

{

DataRow pDataRow = null;

DataSet pDataSet = new DataSet();

DataTable pDataTable = m_DataRowTableClone();

pDataSetLoad(pSqlDataReader, LoadOptionUpsert, pDataTableTableName);

if (pDataSetTables[0]RowsCount != 0)

{

pDataRow = pDataSetTables[0]Rows[0];

}

return pDataRow;

}

该方法经常会出现数值转换错误:如nvarchar 值 '123456789011' 的转换溢出了 int 列。超出了最大整数值。需要用户自己做排错处理。

3、DataTableLoad方法

方法的原理同上,先使用pDataTableLoad(pSqlDataReader, LoadOptionUpsert, null)将数据装入DataTable,然后使用pDataTableRows[0]获取DataRow的值。代码如下:

private DataRow GetDataRow(SqlDataReader pSqlDataReader)

{

DataRow pDataRow = null;

DataSet pDataSet = new DataSet();

DataTable pDataTable = m_DataRowTableClone();

pDataTableRowsClear();

pDataTableLoad(pSqlDataReader, LoadOptionUpsert, null);

if (pDataTableRowsCount != 0)

{

pDataRow = pDataTableRows[0];

}

return pDataRow;

}

同样如果数据不符合则出现上面的错误。

4、SqlDataReaderGetValue和DataTableLoadDataRow方法

首先使用pSqlDataReaderGetValues(Values)将数据输出到数组Values中,然后通过pDataTableLoadDataRow(Values, false)将数据装入DataTable,最后使用pDataRow = pDataTableRows[0]取出需要的值。代码如下:

private DataRow GetDataRow(SqlDataReader pSqlDataReader)

{

DataRow pDataRow = null;

DataSet pDataSet = new DataSet();

DataTable pDataTable = m_DataRowTableClone();

object[] Values = new object[pDataTableColumnsCount];

pSqlDataReaderGetValues(Values);

pDataTableLoadDataRow(Values, false);

if (pDataTableRowsCount != 0)

{

pDataRow = pDataTableRows[0];

}

return pDataRow;

}

5、SqlDataReaderGetValues和DataRowItemArray = Values方法

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

private DataRow GetDataRow1(SqlDataReader pSqlDataReader)

{

DataSet pDataSet = new DataSet();

DataRow pDataRow = m_DataRowTableNewRow();

object[] Values = new object[m_DataRowTableColumnsCount];

pSqlDataReaderGetValues(Values);

pDataRowItemArray = Values;

return pDataRow;

}

注意由于新定义的DataRow没有字段信息,需要对DataRow的列字段进行定义,定义一个空的符合数据要求的DataRow,使用DataTableNewRow();,然后就可以使用该方法pDataRowItemArray = Values进行赋值。该方法效率高。

6、总结

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

-- 测试返回结果集的存储过程

CREATE PROCEDURE testProc

AS

BEGIN

  SELECT 'Hello 1' AS A, 'World 1' AS B UNION ALL

  SELECT 'Hello 2' AS A, 'World 2' AS B;

END

go/// <summary>

/// 测试执行存储过程 返回结果集合

/// </summary>

/// <param name="conn"></param>

private void CallProcedureWithReturnData(SqlConnection conn)

{

    // 创建一个 Command

    SqlCommand testCommand = connCreateCommand();

    // 定义需要执行的SQL语句

    testCommandCommandText = "testProc";

    // 定义好,本次执行的类型,是存储过程

    testCommandCommandType = CommandTypeStoredProcedure;

    // 执行SQL命令,结果存储到Reader中

    SqlDataReader testReader = testCommandExecuteReader();

    // 处理检索出来的每一条数据

    while (testReaderRead())

    {

        // 将检索出来的数据,输出到屏幕上

        ConsoleWriteLine("调用函数:{0}; 返回:{1} - {2}",

            testCommandCommandText, testReader[0], testReader[1]

            );

    }

    // 关闭Reader

    testReaderClose();

}

我这个测试过可行的。  你参考一下。

以上就是关于如何从SqlDataReader中获取DataRow全部的内容,包括:如何从SqlDataReader中获取DataRow、SqlDataReader通过存储过程读取只出现一条数据、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9719606.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存