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

Posted

技术标签:

【中文标题】检查它是不是是 sqldatareader 中的最后一条记录【英文标题】:Check if it's the last record in sqldatareader检查它是否是 sqldatareader 中的最后一条记录 【发布时间】:2012-07-27 01:07:43 【问题描述】:

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

【问题讨论】:

只是好奇,你为什么需要那个? 如果我在最后的记录中,我想做一些例外! 【参考方案1】:

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

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
        
    

【讨论】:

只是我们必须将 if(reader.Read()) 替换为 if(reader.HasRow) @wben 在这种情况下,您将无法在第一次迭代开始时读取值。 错了。正如您现在的代码一样,返回的第一行甚至被跳过。您将阅读器设置为if (reader.Read()) 中的第一条记录,然后设置loop = reader.Read() 直接将阅读器设置为第二条记录。您的解决方案仍然为您解决问题的方式提供了适当的模式。 @ThorstenDittmar 如果您真的阅读了代码 cmets,他并没有跳过第一条记录。他前进到 if 语句中的第一条记录,然后读取值,然后设置 loop = reader.Read() 这是第二条记录。 你是对的,但是代码示例现在的格式非常误导。【参考方案2】:

除了“之后没有另一个”之外,没有。这可能意味着您需要缓冲该行,尝试读取,然后查看缓冲的数据(如果结果是最后一个)。

在很多情况下,当数据适中,你正在构建某种对象模型时,你可以只看构造的数据,即在使用阅读器时将所有行的List<T>,然后之后,查看列表中的最后一行。

【讨论】:

是的,但我不想传递两个循环! @wben 如果它在列表中,则循环非常便宜 - 或者只是通过索引器访问:list[list.Count-1]。当然,缓冲前一行更便宜,但更复杂。 @wben 让事情更清楚,在接受的答案中,其中说“//1。这里检索您需要的值,例如 var myvar = reader.GetBoolean(0);”,这就是我/我们的意思是“缓冲行,尝试读取,然后查看缓冲的数据(如果结果是最后一个)”。当然,代码示例使其更清晰。【参考方案3】:

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

您正在使用查询读取数据。我们称它为 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”子句中。

【讨论】:

【参考方案4】:

遍历SqlDataReader

SqlDataReader reader = ...;
while(reader.Read())

    // the reader will contain the current row

阅读器中没有任何内容告诉您这是最后一行。 如果您仍然需要获取最后一行,也许将行的数据存储在一个单独的变量中,您可以在退出循环后获取该数据。

其他选择是:

将数据放入 DataSet/DataTable 将数据存储在列表/数组中 以相反的顺序检索数据(重写您的查询),以便第一行是您想要的。

【讨论】:

阅读器不是枚举器,它没有 MoveNext()。您需要先请求枚举器,即 reader.GetEnumerator() @RamanZhylich:你是对的。它应该是 reader.Read()。固定的! (编辑帖子)【参考方案5】:

    如您所知,SQLDataReader 没有“行数”属性。您只需阅读到 EOF。

    但是,DataSet 可以。也许您可以替换 DataAdapter 和某种数据集或表:

    http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/dc198199-be24-473c-9973-746fe14d65ba/

【讨论】:

【参考方案6】:

如果不重复自己,您就无法做到这一点,即两次获取记录。这是一个更短的方法

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");

我临时写了这个,所以它没有经过测试,但这就是方法

【讨论】:

以上是关于检查它是不是是 sqldatareader 中的最后一条记录的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 SQLDataReader 项是不是为 DateTime os String 类型值?

SqlDataReader 检查空值的最佳方法 -sqlDataReader.IsDBNull vs DBNull.Value

检查datagridview单元格中的数据是不是为null

检查数组是不是包含Java中的值的最有效方法? [复制]

检查未知对象中的对象是不是存在的最有效的Javascript方法[重复]

检查表中是不是存在行的最有效方法是啥?