我正在尝试从给定的表生成随机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();
}
}
}
}
答案 0 :(得分:5)
由于您基本上是在搜索现有记录的随机ID,我相信这可能会涵盖您尝试做的事情:
Random record from a database table (T-SQL)
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
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返回的一条记录(最多)。
答案 1 :(得分:0)
如果在调试器中检查sqlDataReader的结果,结果就会消失,并且Read()事件不会找到