SqlDataReader Reader.Read() 显示枚举未产生任何结果

SqlDataReader Reader.Read() shows Enumeration yielded no results

我正在尝试从给定的 table 生成随机 ID。我可以看到在调试中生成的随机数,但是当我到达 reader.Read() 行时,它显示 Enumeration 没有产生任何结果。

我不太明白我所缺少的东西。

  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();
            }

        }

        }

    }

由于您基本上是在搜索现有记录的随机 ID,我相信这可能涵盖了您正在尝试做的事情:

Random record from a database table (T-SQL)

SELECT TOP 1 Id FROM Pointer ORDER BY 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:您不能使用 SELECT @max = MAX(Id) FROM 指针计算 @max 吗?无需将其传递给参数。还是我错过了重点?这是故意限制吗?

问题2:不应该是reader[0]还是reader["Id"]?我相信列是从零开始的,您选择的列的名称是 "Id".

问题 3:小心不要通过调试器以某种方式枚举 reader,因为您实际上会在那里使用(一些?)结果(我猜您是通过评论来做到这一点的"// 在这里我可以_看到_生成的随机值") 并且在遇到 reader.Read() 时将没有结果,因为 reader已经枚举了,不会"rewind".

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

DataReader cursor rewind

问题4:为什么用using已经确保了关闭&处置,还要手动关闭reader?您也已经知道这将是返回(最多)TOP 1 的记录。

如果您在调试器中检查 sqlDataReader 的结果,结果就会消失,并且不会被 Read() 事件找到