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通过存储过程读取只出现一条数据、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)