我正在开发一个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: }
答案 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();