SqlDataReader Reader.Read() показывает, что перечисление не дало никаких результатов

Я пытаюсь генерировать случайные идентификаторы из данной таблицы. Я вижу случайное число, сгенерированное в отладке, но когда я дохожу до строки reader.Read(), она показывает, что перечисление не дало никаких результатов.

Я не мог понять, чего мне не хватает.

  private static void GetRandomId(int maxValue)
    {
        string connectionString =
        "Data Source=local;Initial Catalog=Test;user id=Test;password=Test123;";

        string queryString = @"SELECT TOP 1 Id from Pointer WHERE Id > (RAND()  * @max);";


        using (var connection = new SqlConnection(connectionString))
        {
        var command = new SqlCommand(queryString, connection);
        command.Parameters.AddWithValue("@max", maxValue);

        connection.Open();

        using (var reader = command.ExecuteReader()) <--  // Here I can see the randon value generated
        {
            while (reader.Read())
            {

           //Here reader shows : Enumeration yielded no results
            Console.WriteLine("Value", reader[1]);

            reader.Close();
            }

        }

        }

    }

2 ответа

Решение

Поскольку вы в основном ищете случайный идентификатор существующей записи, я думаю, что это может охватывать то, что вы пытаетесь сделать:

Случайная запись из таблицы базы данных (T-SQL)

ВЫБЕРИТЕ ТОП 1 идентификатор из указателя ЗАКАЗАТЬ NEWID()

Вместо этого используйте метод SqlCommand.ExecuteScalar

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar%28v=vs.110%29.aspx

var dbRandomId = command.ExecuteScalar();
var randomId = Convert.IsDbNull(dbRandomId) ? (int?)null : (int)dbRandomId;
// you now also know if an id was returned with randomId.HasValue

https://msdn.microsoft.com/en-us/library/system.convert.isdbnull%28v=vs.110%29.aspx

Проблемы с вашим примером:

Проблема 1: Не могли бы вы вычислить @max с помощью SELECT @max = MAX(Id) FROM Pointer? Нет необходимости передавать его в параметре. Или я упускаю суть? Это преднамеренное ограничение?

Проблема 2: Разве это не должно быть читатель [0] или читатель ["Id"]? Я считаю, что столбцы начинаются с нуля, а выбранный вами столбец называется "Id".

Проблема 3: будьте осторожны, чтобы не перечислить читателя с помощью отладчика, потому что вы на самом деле будете использовать (некоторые из?) Результаты прямо здесь (я полагаю, вы делаете это с помощью своего комментария "// Здесь я могу _посмотреть случайное значение "" и ко времени обнаружения reader.Read() результатов не останется, так как считыватель уже был перечислен и не будет "перематываться".

https://msdn.microsoft.com/en-us/library/aa326283%28v=vs.71%29.aspx

Перемотка курсора DataReader

Проблема 4: Почему вы закрываете считыватель вручную, когда вы уже обеспечили закрытие и удаление с использованием? Вы также уже знаете, что будет возвращена одна (самая большая) запись с TOP 1.

Если вы проверите результаты sqlDataReader в отладчике, результаты затем исчезнут и не будут найдены событием Read()

Другие вопросы по тегам