使用SQL调用从数据库中检索数据后的特定if else语句。 Visual Studios 2015 / C#

时间:2018-04-29 05:03:28

标签: c# sql-server ado.net sqldatareader

我试图为我一直在努力的项目添加画龙点睛,目前我正在尝试修改我创建的功能。其特点是,如果学生完成考试,他们就能查看结果。但是,我想要做的是创建一个if else语句,基本上是:如果考试已经完成,那么它们将被重定向到向他们展示特定考试成绩的页面。否则,它会在页面顶部返回一条消息,说明"此检查尚未完成。"

我当前的代码(通过页面上的按钮操作)是:

protected void btnViewPrevExam_Click(object sender, EventArgs e)
    {
        Session["intExaminationID"] = ddlExamination.SelectedValue; 
        Int32 int32StudentID = Convert.ToInt32(Session["StudentID"]);
        Session["int32StudentID"] = Convert.ToInt32(int32StudentID);

        // Define the ADO.NET connection object.
        SqlConnection objSqlConnection = new SqlConnection(WebConfigurationManager.ConnectionStrings["OPT"].ConnectionString);

        // Develop the SQL call.
        // Develop the SQL call.
        String strSQL = "";
        strSQL = "SELECT AnswerID, Question, OptionA, OptionB, OptionC, OptionD, CorrectAnswer, Answer ";
        strSQL += " FROM Question, Answer, Examination, Student ";
        strSQL += " WHERE Examination.ExaminationID = " + ddlExamination.SelectedValue;
        strSQL += " AND Student.StudentID = " + int32StudentID;
        strSQL += " AND Answer.QuestionID = Question.QuestionID ";
        strSQL += " AND Answer.StudentID = Student.StudentID ";
        strSQL += " AND Examination.ExaminationID = Question.ExaminationID ";
        // Create the SQL command object.
        SqlCommand objSqlCommand = new SqlCommand(strSQL, objSqlConnection);
        // Retrieve the row from the table.
        objSqlConnection.Open();
        SqlDataReader objSqlDataReader = objSqlCommand.ExecuteReader();
        objSqlDataReader.Read();
        if (strSQL != null)
        {
            objSqlDataReader.Close();
            objSqlConnection.Close();
            Response.Redirect("StudentExamResults.aspx");
        }
        else 
        {
            this.Master.MessageForeColor = System.Drawing.Color.Red;
            this.Master.Message = "The selected examination has not been completed.";
        }        
    }

此按钮当前的作用是,无论考试是否已完成,它都会将学生发送到考试结果页面。这是由于" if(strSQL!= null)"并且它永远不会为null,因为SQL调用已经完成并被填充。我尝试了其他想法,以及为AnswerID执行objSqlDataReader,但它没有正常工作。这是我想要添加到这个项目中的一个小额外功能,如果我能找到一些帮助来理清我做错了什么,我会非常高兴。提前谢谢!

2 个答案:

答案 0 :(得分:2)

测试>>> words_copy = words.copy() >>> def select_word(): if len(words_copy) == 0: raise Exception("No More Unique Word Left") chosen_index = random.randint(0,len(words_copy)-1) chosen_word = words_copy[chosen_index] del words_copy[chosen_index] return chosen_word 不是strSQL是否会成功,因为您在方法前面将其设置为非null值。

要查看以前完成的考试是否已存在记录,您需要检查对objSqlDataReader.Read()的呼叫的返回值;只要在null查询中有其他行(或者,在本例中为第一行),它就会返回true。因此,改变这个......

SELECT

......对此...

objSqlDataReader.Read();
if (strSQL != null)
{

作为补充说明,请考虑在using blocks中包装if (objSqlDataReader.Read()) { objSqlConnectionobjSqlCommand,以确保正确关闭/处置它们。就像现在一样,当考试需要完成时,您不会关闭objSqlDataReaderobjSqlDataReader,并且根本不会处理objSqlConnection。无论objSqlCommand的哪个分支被采用,objSqlDataReader将按如下方式关闭......

if

答案 1 :(得分:1)

假设您不关心内容,而只是想检查该行是否存在,您可以这样做:

string sql = "SELECT COUNT(AnswerID) FROM Question ........ WHERE ......";

using (var connection = CreateConnection()) {
    using (var cmd = new SqlCommand(sql, connection)) {
        bool exists = (int) cmd.ExecuteScalar() > 0;
        if (exists) {
            Response.Redirect("StudentExamResults.aspx");
        } else {
            // Do the other thing
        }
    }
}