有没有办法检查我是否在最后一张唱片上? 感谢
答案 0 :(得分:16)
使用此模式识别并处理结果中的最后一行:
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
}
}
}
答案 1 :(得分:5)
除了“之后没有其他人”,没有。这可能意味着您需要缓冲行,尝试读取,然后查看缓冲数据,如果它是最后一个。
在许多情况下,当数据适中并且您正在构建某种对象模型时,您只需查看构造的数据,即在使用阅读器时生成所有行的List<T>
,然后之后,请查看列表中的最后一行。
答案 2 :(得分:1)
迭代SqlDataReader
:
SqlDataReader reader = ...;
while(reader.Read())
{
// the reader will contain the current row
}
读者没有告诉你这是最后一行。 如果您仍然需要进入最后一行,可能将行的数据存储在单独的变量中,您可以在退出循环后获取该数据。
其他替代方案是:
答案 3 :(得分:0)
如您所知,SQLDataReader没有“行计数”属性。你只需阅读直至EOF。
但是,DataSet 确实。也许您可以替换DataAdapter和某种数据集或表:
答案 4 :(得分:0)
另一种可能性是将信息放入数据集中。
您正在使用查询阅读数据。我们称之为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”子句中。
答案 5 :(得分: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");
}
我写了这个副手所以它没有经过测试,但这就是方法