为什么我在SQL查询中使用MIN时系统出错?

时间:2012-01-01 12:43:11

标签: c# asp.net

我正在开发一个Web应用程序,通过电子邮件将测验发送给所有用户。如果数据库中有多个测验之前没有发送给用户,系统应选择最小测验ID而不是最大测验。

 string quizid = "";

 // Open DB connection.
 conn.Open();

 string cmdText = "SELECT MIN (QuizID) FROM dbo.QUIZ WHERE IsSent <> 1";
 using (SqlCommand cmd = new SqlCommand(cmdText, conn))
 {
     SqlDataReader reader = cmd.ExecuteReader();
     if (reader != null)
     {
         while (reader.Read())
        {
             // There is only 1 column, 
             // so just retrieve it using the ordinal position
             quizid = reader["QuizID"].ToString();
        }
      }
      reader.Close();
   }

当我使用MIN时,它给了我以下错误:

  

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.IndexOutOfRangeException:QuizID

     

来源错误:

> Line 69:                     { 
> Line 70:                         //
> There is only 1 column, so just retrieve it using the ordinal position
> Line 71:                         quizid = reader["QuizID"].ToString();
> Line 72:  
> Line 73:                     }

3 个答案:

答案 0 :(得分:4)

MIN(QuizID)是未命名的计算列。

您可以编写reader[0]来选择第一列,也可以通过编写SELECT MIN(QuizID) AS SomeName FROM ...来命名该列。

答案 1 :(得分:2)

正如错误行上方的评论所示:

quizid = reader[0].ToString();

或者如果要使用name,则必须在SQL语句中提供别名:

string cmdText = "SELECT MIN (QuizID) As QuizID FROM dbo.QUIZ WHERE IsSent <> 1";

然后原始的代码行将起作用。

答案 2 :(得分:1)

或者,(以及正确答案) 您可以按照自己的意愿命名该列

string cmdText = "SELECT MIN (QuizID) AS mQuizID FROM dbo.QUIZ WHERE IsSent <> 1";
quizid = reader["mQuizID"].ToString();