Есть ли способ проверить, находится ли я на последней записи? спасибо
Проверьте, была ли последняя запись в sqldatareader
Ответ 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
}
}
}
Ответ 2
Кроме "после этого нет другого", нет. Это может означать, что вам нужно буферизовать строку, попытаться прочитать, а затем просмотреть буферизованные данные, если она окажется последней.
Во многих случаях, когда данные умеренные и вы создаете какую-либо объектную модель, вы можете просто просмотреть построенные данные, т.е. сделать List<T>
всех строк при использовании читателя, затем после этого, посмотрите на последнюю строку в списке.
Ответ 3
Чтобы выполнить итерацию через SqlDataReader
:
SqlDataReader reader = ...;
while(reader.Read())
{
// the reader will contain the current row
}
В читателе ничего не говорится о последней строке. Если вам по-прежнему нужно попасть в последнюю строку, возможно, сохраняя данные строки в отдельной переменной, вы можете получить эти данные после выхода из цикла.
Другие альтернативы:
- чтобы получить данные в DataSet/DataTable
- для хранения данных в списке/массиве
- получить данные в обратном порядке (переписать запрос), чтобы первая строка была той, которую вы хотите.
Ответ 4
-
Как вы знаете, SQLDataReader не имеет свойства "row count". Вы только что прочитали до EOF.
-
Однако, DataSet делает. Возможно, вы можете заменить DataAdapter и некоторый набор данных или таблицу:
Ответ 5
Другой возможностью было бы поместить информацию в набор данных.
Вы читаете данные, используя запрос. Пусть это называется 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, которые вы можете проверить в своем приложении.
Кстати, это предполагает, что вы извлекаете данные неупорядоченным способом. Если вы хотите упорядочить, поставьте критерии в разделе "order by" для row_number().
Ответ 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");
}
Я написал это вне руки, чтобы он не тестировался, но что подход