所以我按平均评级排序不同的ID,执行以下操作:
sql = "SELECT TOP 10 MovieID, ROUND(AVG(CAST(Rating AS Float)), 2) as AvgRating " +
"FROM Reviews GROUP BY MovieID ORDER BY AvgRating DESC;";
dbCmd = new SqlCommand();
dbCmd.Connection = dbConn;
dbCmd.CommandText = sql;
SqlDataReader result = dbCmd.ExecuteReader();
int movieId = -1;
while (result.Read())
{
movieId = result.GetInt32(0);
break;
}
sql查询应该检索前10个ID。我可以使用result.GetInt32(0)
获得第一个,但我想知道如何得到其余部分,因为如果我尝试result.GetInt32(1)
它会超出数组的范围。
任何见解都会有所帮助
答案 0 :(得分:3)
我认为你需要的是制作一系列movieIds,因为你正计划阅读10部不同的电影,对吧?为什么不把它改成这样的东西:
int[] movies = new int[10];
int cntr = 0;
while(result.Read())
{
movies[cntr] = result.GetInt32(0);
cntr++;
}
修改强>
当然,这不是错误证明。如果你没有10部电影的足够数据,你会怎么做,你的阵列可能只是部分填充,所以记得要防止这样的事情。
编辑2
为了更好的解释,我很抱歉,我已经把它排除了,你应该使用while循环(我怀疑你理解,因为你已经把它放入)的原因是你可以迭代结果集。当然,您已经请求了10行,但是不能保证您收到10行,因此您应该使用while而不是for循环。另外,我添加了一个计数器变量,用于查看您所在的值,并将id放入数组中的相应位置。
我确实在这里看到两个主要的潜在错误,你必须决定如何处理。
1)如果返回的行少于10行,您将如何处理数组中的空值?
2)如果返回的行数超过10行,您将如何阻止尝试在movies[11]
处提供电影ID?我也建议做这样的事情:
while(result.Read() && cntr < 10)
答案 1 :(得分:1)
如果您对以下
感到不舒服result.GetInt32(0);
通过使用它,您会牺牲代码可读性而不是使用
int MovieID= Convert.ToInt32(result["MovieID"]);
现在您可以在任何列表/数组中添加它。
int[] movieIDs = new int[10];
int counter = 0;
while(result.Read())
{
movieIDs [counter] = Convert.ToInt32(result["MovieID"]);
counter++;
}
OR
List<int> list = new List<int>();
while(result.Read())
{
int movieID = Convert.ToInt32(result["MovieID"]);
list.Add(movieID);
}
列表的优点是
您不需要像计数器一样记录索引
如果明天您希望返回20个ID,则列表可以处理
所有其他好处,如排序,安排等都会有内置方法