如何访问数据读取器中的特定行

本文关键字:读取 数据 何访问 访问 | 更新日期: 2023-09-27 17:59:54

我在下载批量报告时得到了OutOfMemoryException。因此,我使用DataReader而不是DataSet来更改代码。

如何在DataReader中实现以下代码,因为我无法使用任何DataTables&DataSet在我的编码中。

if (dataSet.Tables[0].Rows[i + 1]["Sr No"].ToString() == dataSet.Tables[0].Rows[i]["Sr No"].ToString())

如何访问数据读取器中的特定行

我认为您无法访问尚未执行的行。按照我的理解,DataReader从数据库中读取数据时会逐行返回。

您可以尝试以下操作:

这将遍历DataReader将在数据集中返回的每一行。在这里,您可以检查某些值/条件,如下所示:

while (dataReader.Read())
{
    var value = dataReader["Sr No"].ToString();
    //Your custom code here
}

或者,如果您希望这样做,您也可以指定列索引,而不是名称,如下所示:

while (dataReader.Read())
{
    var value = dataReader.GetString(0); //The 0 stands for "the 0'th column", so the first column of the result.
    //Your custom code here
}

更新为什么不将从DataReader读取的所有值放在一个列表中,然后如果需要,可以使用该列表进行值之间的比较。

不要在客户端级别过滤行。

最好在服务器上搜索正确的行,在它们到达客户端之前,而不是将所有行提取到客户端中,然后在那里进行过滤。只需将您的搜索条件合并到SQL查询本身中,然后获取服务器已经为您找到的行。

这样做:

  • 允许服务器使用索引和其他数据库结构来识别"感兴趣"的行,这可能比线性搜索所有行快得多
  • 客户端和服务器之间的网络连接不会被大量的行饱和,其中大部分行在最后都会被丢弃
  • 可以让您的客户端以简单的方式一次处理一行(例如使用DbDataReader),而不是像您那样额外处理和/或在内存中存储多行(甚至所有行)

在您的特定情况下,看起来您需要一个自联接,或者可能需要一个分析(也称为"窗口")函数。如果不了解更多关于数据库结构的信息,也不知道你实际想完成什么,我不知道你的确切查询会是什么样子,有一点可能是这样的:

-- Sample data...
CREATE TABLE T (
    ID int PRIMARY KEY,
    SR_NO int
);
INSERT INTO T VALUES
    (1, 100),
    (2, 101),
    (3, 101),
    (4, 100);
-- The actual query...
SELECT
    *
FROM (
    SELECT
        *,
        LEAD(SR_NO) OVER (ORDER BY ID) NEXT_SR_NO
    FROM
        T T1
) Q
WHERE
    SR_NO = NEXT_SR_NO;

结果:

ID  SR_NO   NEXT_SR_NO
2   101     101

您可以通过使用do-while循环来实现这一点。在检查条件之前,将读取下一行,您也可以访问该行。试试这个代码:

do
{
    your code
}
while(myreader.Read())