检查它是否是sqldatareader中的最后一条记录
使用此模式在结果识别和处理的最后一行:
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
}
}
}
除了“之后没有另一个”,没有。这可能意味着你需要缓冲行,尝试读取,然后查看缓冲的数据,如果它是最后一个。在许多情况下,当数据适中并且您正在构建某种对象模型时,您可以查看构造的数据,即在使用读取器时制作所有行的List<T>
,然后在之后制作一个List<T>
,看看列表中的最后一行。
是的,但我不想传递两个循环! – wben 2012-07-28 17:59:36
@ wben如果它在列表中,循环非常便宜 - 或者只是由索引器访问:'list [list.Count-1]'。当然,缓冲前一行甚至更便宜,但更复杂。 – 2012-07-28 18:48:28
@wben使事情更清晰,在接受的答案中,在哪里说“// 1。这里需要检索的值,例如var myvar = reader.GetBoolean(0);”,这就是我/我们所说的“缓冲区行,尝试读取,然后查看缓冲的数据,如果它是最后一个“。当然,代码示例更清晰。 – 2012-07-28 18:50:39
如您所知,SQLDataReader没有“行数”属性。你只是读直到EOF。
-
但是,数据集确实是。也许你可以代替一个DataAdapter和某种数据集或表:
迭代通过SqlDataReader
:
SqlDataReader reader = ...;
while(reader.Read())
{
// the reader will contain the current row
}
没有什么在读者讲述你是最后一排。 如果您仍然需要查看最后一行,可能将行的数据存储在单独的变量中,那么您可以在退出循环后获取该数据。
其他替代方案是:
- 获取数据到DataSet/DataTable中
- 将数据存储在一个列表/阵列
- 检索以相反的顺序数据(重写查询) ,所以第一行是你想要的。
阅读器不是枚举器,它没有MoveNext()。您需要首先请求枚举器,即reader.GetEnumerator() – 2012-07-28 18:16:58
@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");
}
我写这离手,所以它没有测试过,但那是方法
只是好奇,为什么你需要的是什么? – codingbiz 2012-07-28 17:46:27
如果我在最后的唱片上,我想要做一些例外! – wben 2012-07-28 17:54:53