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
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
Проблема 4: Почему вы закрываете считыватель вручную, когда вы уже обеспечили закрытие и удаление с использованием? Вы также уже знаете, что будет возвращена одна (самая большая) запись с TOP 1.
Если вы проверите результаты sqlDataReader в отладчике, результаты затем исчезнут и не будут найдены событием Read()