有没有办法检查我是否在最后一条记录上?谢谢
问问题
21440 次
6 回答
20
使用此模式来识别和处理结果中的最后一行:
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
}
}
}
于 2012-07-28T18:04:21.640 回答
5
除了“之后没有另一个”之外,没有。这可能意味着您需要缓冲该行,尝试读取,然后查看缓冲的数据(如果结果是最后一个)。
在很多情况下,当数据适中,你正在构建某种对象模型时,你可以只看构造的数据,即List<T>
在使用阅读器时将所有行都做一个,然后再看最后一行在列表中。
于 2012-07-28T17:47:41.213 回答
1
遍历SqlDataReader
:
SqlDataReader reader = ...;
while(reader.Read())
{
// the reader will contain the current row
}
阅读器中没有任何内容告诉您这是最后一行。如果您仍然需要进入最后一行,也许将该行的数据存储在一个单独的变量中,您可以在退出循环后获取该数据。
其他选择是:
- 将数据放入 DataSet/DataTable
- 将数据存储在列表/数组中
- 以相反的顺序检索数据(重写您的查询),以便第一行是您想要的。
于 2012-07-28T17:59:20.073 回答
1
另一种可能性是将信息放入数据集中。
您正在使用查询读取数据。我们称它为 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”子句中。
于 2012-07-28T17:59:36.407 回答
0
如您所知,SQLDataReader 没有“行数”属性。你只是读到EOF。
但是,DataSet可以。也许您可以替换 DataAdapter 和某种数据集或表:
于 2012-07-28T17:54:37.407 回答
0
如果不重复自己,即两次获取记录,您将无法做到这一点。这是一个更短的方法
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");
}
我临时写了这个,所以它没有经过测试,但这就是方法
于 2012-07-28T18:09:12.803 回答