SqlDataReader Reader.Read()显示Enumeration没有产生任何结果

HXD*_*HXD 1 c# sqlcommand

我正在尝试从给定的表生成随机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();
            }

        }

        }

    }
Run Code Online (Sandbox Code Playgroud)

Dem*_*tos 5

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

来自数据库表的随机记录(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
Run Code Online (Sandbox Code Playgroud)

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

您的示例有问题:

问题1:你不能用SELECT @max = MAX(Id)FROM指针计算@max吗?无需在参数中传递它.或者我错过了这一点?这是故意的限制吗?

问题2:不应该是读者[0]或读者["Id"]吗?我相信列是基于零的,您选择的列的名称是"Id".

问题3:注意不要通过调试器以某种方式枚举读者,因为你实际上会消耗(某些?)结果(我猜你是通过你的评论来做到这一点)//这里我可以_see_随机值生成")并且当遇到reader.Read()时,将没有结果,因为已经枚举了读者并且它不会"倒带".

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

DataReader游标倒带

问题4:当您已确保使用时关闭和处理时,为什么要手动关闭阅读器?你也已经知道它将是TOP 1返回(最多)的一条记录.