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

时间:2015-05-04 23:29:38

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

        }

        }

    }

2 个答案:

答案 0 :(得分:5)

由于您基本上是在搜索现有记录的随机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:不应该是读者[0]或读者[“Id”]吗?我相信列是基于零的,您选择的列的名称是“Id”。

问题3:注意不要通过调试器以某种方式枚举读者,因为你实际上会在那里消耗(某些?)结果(我猜你是通过你的评论来做到这一点的“//在这里我可以_see_生成的随机值“),当遇到reader.Read()时,由于读者已被枚举而且不会”倒带“,因此不会有任何结果。

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

DataReader cursor rewind

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

答案 1 :(得分:0)

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