Проверьте, была ли последняя запись в 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
  • для хранения данных в списке/массиве
  • получить данные в обратном порядке (переписать запрос), чтобы первая строка была той, которую вы хотите.

Ответ 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");
}

Я написал это вне руки, чтобы он не тестировался, но что подход