检查它是否是sqldatareader中的最后一条记录

问题描述:

有没有办法检查我是否在最后一条记录上? 谢谢检查它是否是sqldatareader中的最后一条记录

+2

只是好奇,为什么你需要的是什么? – codingbiz 2012-07-28 17:46:27

+2

如果我在最后的唱片上,我想要做一些例外! – wben 2012-07-28 17:54:53

使用此模式在结果识别和处理的最后一行:

if (reader.Read()) 
{ 
    var loop = true; 
    while (loop) 
    { 
     //1. Here retrive values you need e.g. var myvar = reader.GetBoolean(0); 
     loop = reader.Read(); 
     if (!loop) 
     { 
      //You are on the last record. Use values read in 1. 
      //Do some exceptions 
     } 
     else { 
      //You are not on the last record. 
      //Process values read in 1., e.g. myvar 
     } 
    } 
} 
+0

谢谢老兄,这是最好的解决方案! – wben 2012-07-28 18:12:06

+3

只需要用if(reader.HasRow) – wben 2012-07-29 18:27:25

+2

@wben替换if(reader.Read())在这种情况下,您将无法在第一次迭代开始时读取值。 – 2012-07-30 08:58:59

除了“之后没有另一个”,没有。这可能意味着你需要缓冲行,尝试读取,然后查看缓冲的数据,如果它是最后一个。在许多情况下,当数据适中并且您正在构建某种对象模型时,您可以查看构造的数据,即在使用读取器时制作所有行的List<T>,然后在之后制作一个List<T>,看看列表中的最后一行。

+0

是的,但我不想传递两个循环! – wben 2012-07-28 17:59:36

+0

@ wben如果它在列表中,循环非常便宜 - 或者只是由索引器访问:'list [list.Count-1]'。当然,缓冲前一行甚至更便宜,但更复杂。 – 2012-07-28 18:48:28

+0

@wben使事情更清晰,在接受的答案中,在哪里说“// 1。这里需要检索的值,例如var myvar = reader.GetBoolean(0);”,这就是我/我们所说的“缓冲区行,尝试读取,然后查看缓冲的数据,如果它是最后一个“。当然,代码示例更清晰。 – 2012-07-28 18:50:39

  1. 如您所知,SQLDataReader没有“行数”属性。你只是读直到EOF。

  2. 但是,数据集确实是。也许你可以代替一个DataAdapter和某种数据集或表:

迭代通过SqlDataReader

SqlDataReader reader = ...; 
while(reader.Read()) 
{ 
    // the reader will contain the current row 
} 

没有什么在读者讲述你是最后一排。 如果您仍然需要查看最后一行,可能将行的数据存储在单独的变量中,那么您可以在退出循环后获取该数据。

其他替代方案是:

  • 获取数据到DataSet/DataTable中
  • 将数据存储在一个列表/阵列
  • 检索以相反的顺序数据(重写查询) ,所以第一行是你想要的。
+0

阅读器不是枚举器,它没有MoveNext()。您需要首先请求枚举器,即reader.GetEnumerator() – 2012-07-28 18:16:58

+0

@RamanZhylich:您说得对。它应该是reader.Read()。固定! (编辑帖子) – 2012-07-28 19:22:24

另一种可能性是将信息放入数据集中。

您正在使用查询阅读数据。我们称之为q。改为使用此查询:

select row_number() over (order by (select NULL)) as seqnum, 
     count(*) over (partition by null) as numrecs 
     q.*, 
from (<q>) q 
order by seqnum 

现在最后一条记录有seqnum = numrecs,您可以在应用程序中测试它。

顺便说一句,这假定您正在以无序的方式检索数据。如果要进行排序,请将条件放入row_number()的“order by”子句中。

你不能这样做,不重复自己,即获取记录两次。这里是一个简短的表达方式

System.Data.DataTable dt = new System.Data.DataTable(); 
dt.Load(myDataReader); 
int recordCount = dt.Rows.Count; 
if(recordCount > 0) 
{ 
    if(dt.Rows[recordCount-1]["username"] == "wrong value") 
    throw new Exception("wrong value"); 
} 

我写这离手,所以它没有测试过,但那是方法