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

Posted

技术标签:

【中文标题】如何访问数据读取器中的特定行?【英文标题】:How to access specific row in datareader? 【发布时间】:2016-08-02 06:46:20 【问题描述】:

我在下载批量报告时收到了OutOfMemoryException。所以我通过使用 DataReader 而不是 DataSet 来更改代码。

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

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

【问题讨论】:

实际查询是什么? csharp-station.com/Tutorial/AdoDotNet/Lesson04 使用 DataReader 检索数据 - MSDN - Microsoft msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx ***.com/questions/1855556/datareader-best-practices @LucMorin 我的意思是 DataReader 是从记录集中按顺序读取记录。当我阅读 3 条记录时,我想知道第 4 条记录 SRNO 列的值。那么如何实现这一目标 【参考方案1】:

我认为您无法访问尚未执行的行。按照我的理解,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 读取的所有值放入一个列表中,如果需要,您可以在之后使用此列表进行值之间的比较。

【讨论】:

无论你建议什么都可以,但例如。如果我第一次进入 while 循环,它会检索 1 行 [sr.no] 列。但是我如何获得 2 行 [srno] 列。 我认为您无法访问尚未执行的行。按照我的理解,DataReader 从数据库中读取数据时会逐行返回。【参考方案2】:

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

最好在服务器上搜索正确的行,它们甚至到达客户端之前,而不是将所有行获取到客户端然后在那里过滤。只需将您的搜索条件合并到 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

【讨论】:

【参考方案3】:

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

do

    your code

while(myreader.Read())

【讨论】:

以上是关于如何访问数据读取器中的特定行?的主要内容,如果未能解决你的问题,请参考以下文章

读取文件直到python中的特定行

linux shell 如何读取文件特定位置的数据?

如何使用 JDBC/Java 访问和显示 MySQL 关系数据库中的特定记录?

访问 Core Data 中的特定条目

如何通过基于R中的条件过滤行来读取文件

如何从文件中读取特定行(按行号)?