检查它是否是sqldatareader中的最后一条记录
有没有办法检查我是否在最后一张唱片上? 谢谢
使用此模式来标识和处理结果中的最后一行:
if (reader.Read()) { var loop = true; while (loop) { //1. Here retrive values you need eg 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., eg myvar } } }
除了“之后没有其他人”,没有。 这可能意味着您需要缓冲行,尝试读取,然后查看缓冲数据,如果它是最后一个。
在许多情况下,当数据适中并且您正在构建某种类型的对象模型时,您可以只查看构造的数据,即在使用阅读器时创建所有行的List
,然后查看在列表的最后一行。
迭代SqlDataReader
:
SqlDataReader reader = ...; while(reader.Read()) { // the reader will contain the current row }
读者没有告诉你这是最后一行。 如果您仍然需要进入最后一行,可能将行的数据存储在单独的变量中,您可以在退出循环后获取该数据。
其他替代方案是:
- 将数据导入DataSet / DataTable
- 将数据存储在列表/数组中
- 以相反的顺序检索数据(重写您的查询),以便第一行是您想要的那一行。
-
如您所知,SQLDataReader没有“行计数”属性。 你只需阅读直至EOF。
-
但是,DataSet 可以 。 也许您可以替换DataAdapter和某种数据集或表:
另一种可能性是将信息放入数据集中。
您正在使用查询读取数据。 我们称之为q。 请改用此查询:
select row_number() over (order by (select NULL)) as seqnum, count(*) over (partition by null) as numrecs q.*, from () 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"); }
我写了这个副手,所以它没有经过测试,但这就是方法