Конкретный оператор if else после использования вызова SQL для извлечения данных из базы данных. Visual Studios 2015 / C # - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь добавить последний штрих к проекту, над которым я работаю, и в настоящее время пытаюсь изменить созданную мной функцию. Особенность заключается в том, что если студент сдал экзамен, он может просматривать результаты. Тем не менее, я хочу создать заявление 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)», и она никогда не будет нулевой, поскольку вызов SQL был выполнен и заполнен. Я пробовал другие идеи, а также выполнял objSqlDataReader для AnswerID, но он не работал должным образом. Это небольшая дополнительная функция, которую я хотел бы добавить к этому проекту, о которой я подумал, и был бы очень рад, если бы смог найти помощь в выяснении того, что я делаю неправильно. Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Если вы не заботитесь о содержимом, а просто хотите проверить, существует ли строка, вы можете сделать что-то вроде этого:

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
        }
    }
}
0 голосов
/ 29 апреля 2018

Тестирование, если strSQL не равно null, всегда будет успешным, потому что вы устанавливаете для него значение, отличное от null, ранее в методе.

Чтобы узнать, существует ли уже запись для ранее выполненного экзамена, вам необходимо проверить значение возврата по номеру objSqlDataReader.Read(); он будет возвращать true, пока есть дополнительные строки (или, в данном случае, первая строка) для использования из вашего запроса SELECT. Таким образом, измените это ...

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

... к этому ...

if (objSqlDataReader.Read())
{

В качестве дополнительного примечания рассмотрим упаковку objSqlConnection, objSqlCommand и objSqlDataReader в using блоков , чтобы убедиться, что они правильно закрыты / утилизированы. Как и сейчас, вы не закрываете objSqlDataReader и objSqlConnection, когда экзамен должен быть завершен, а objSqlCommand вообще не утилизируется. objSqlDataReader будет затем закрыт следующим образом, независимо от того, какая ветвь if будет взята ...

using (SqlDataReader objSqlDataReader = objSqlCommand.ExecuteReader())
{
    if (objSqlDataReader.Read())
    {
        //objSqlDataReader.Close();// No longer necessary - handled by using
        objSqlConnection.Close();
        Response.Redirect("StudentExamResults.aspx");
    }
    else 
    {
        this.Master.MessageForeColor = System.Drawing.Color.Red;
        this.Master.Message = "The selected examination has not been completed.";
    }
}
...