我在下载批量报告时获得了OutOfMemoryException
。因此,我使用DataReader
代替DataSet
来更改代码。
如何在DataReader
中实现以下代码,因为我无法使用任何DataTables
&我的编码中DataSet
。
if (dataSet.Tables[0].Rows[i + 1]["Sr No"].ToString() == dataSet.Tables[0].Rows[i]["Sr No"].ToString())
答案 0 :(得分: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
读取的所有值放入列表中,然后您可以使用此列表在需要时比较值。
答案 1 :(得分:0)
不要在客户端级别过滤行。
最好在服务器上搜索正确的行,之前它们甚至到达客户端,而不是将所有行提取到客户端然后在那里进行过滤。只需将搜索条件合并到SQL查询本身,然后获取服务器已经为您找到的行。
这样做:
DbDataReader
),而不是在内存中进行额外的处理和/或存储多行(甚至是所有行,就像您一样所做的那样)。在您的特定情况下,看起来您需要自我加入,或者可能是分析(也称为&#34;窗口&#34;)功能。在不了解您的数据库结构或您实际想要完成的内容的情况下,我无法知道您的确切查询将会是什么样子,它可能是这样的:
-- 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
答案 2 :(得分:0)
您可以使用do-while循环来执行此操作。在检查条件之前,将读取下一行,您也可以访问该行。尝试以下代码:
do
{
your code
}
while(myreader.Read())