Есть ли способ проверить, находится ли я на последней записи? спасибо
Проверьте, была ли последняя запись в 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");
}
Я написал это вне руки, чтобы он не тестировался, но что подход