SQL C#试图访问前10个值

时间:2014-11-10 02:53:46

标签: c# sql

所以我按平均评级排序不同的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)它会超出数组的范围。

任何见解都会有所帮助

2 个答案:

答案 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,则列表可以处理

  • 所有其他好处,如排序,安排等都会有内置方法