我正在尝试从给定的表生成随机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)
由于您基本上是在搜索现有记录的随机ID,我相信这可能涵盖您要做的事情:
SELECT TOP 1 Id FROM Pointer ORDER BY 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
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
问题4:当您已确保使用时关闭和处理时,为什么要手动关闭阅读器?你也已经知道它将是TOP 1返回(最多)的一条记录.