public Result LoadQuestionsForACandidateInExam(CandidateForExam oCandidateForExam)
        {
            //new CLogger("Start LoadQuestionsForACandidateInExam CandidateExamProcessBO+BO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start LoadQuestionsForACandidateInExam CandidateExamProcessBO+BO", ELogLevel.Debug);

            Result oResult = new Result();

            CandidateExamProcessDAO oCandidateExamProcessDAO = new CandidateExamProcessDAO();

            try
            {
                oResult = oCandidateExamProcessDAO.LoadQuestionsForACandidateInExam(oCandidateForExam);
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultMessage = "Exception in Question Load For an Exam..";
                oResult.ResultException = oEx;

                //new CLogger("Exception LoadQuestionsForACandidateInExam CandidateExamProcessBO+BO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Exception LoadQuestionsForACandidateInExam CandidateExamProcessBO+BO", ELogLevel.Debug, oEx);
            }

            //new CLogger("Out LoadQuestionsForACandidateInExam CandidateExamProcessBO+BO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Out LoadQuestionsForACandidateInExam CandidateExamProcessBO+BO", ELogLevel.Debug);

            return oResult;
        }
        public Result CandidateSetup(CandidateForExam oCandidateForExam)
        {
            //new CLogger("Start CandidateSetup CandidateBO+BO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start CandidateSetup CandidateBO+BO", ELogLevel.Debug);

            Result oResult = new Result();

            try
            {
                CandidateDAO oCategoryDAO = new CandidateDAO();

                oResult = oCategoryDAO.CandidateSetup(oCandidateForExam);
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Exception occured during Candidate Setup..";

                //new CLogger("Exception CandidateSetup CandidateBO+BO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Exception CandidateSetup CandidateBO+BO", ELogLevel.Debug, oEx);
            }

            //new CLogger("Out CandidateSetup CandidateBO+BO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Out CandidateSetup CandidateBO+BO", ELogLevel.Debug); ;

            return oResult;
        }
        public Result LoadQuestionsForACandidateInExamByCategoryAndType(Category oCategory, QuestionType oQuestionType, CandidateForExam oCandidateForExam)
        {
            Result oResult = new Result();

            CandidateExamProcessDAO oCandidateExamProcessDAO = new CandidateExamProcessDAO();

            try
            {
                oResult = oCandidateExamProcessDAO.LoadQuestionsForACandidateInExamByCategoryAndType(oCategory, oQuestionType, oCandidateForExam);
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultMessage = "Exception in Question Load by Category & Type For an Exam..";
                oResult.ResultException = oEx;
            }

            return oResult;
        }
        public Result SaveCandidateAnswers(CandidateForExam oCandidateForExam)
        {
            //new CLogger("Start SaveCandidateAnswers CandidateExamProcessBO+BO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start SaveCandidateAnswers CandidateExamProcessBO+BO", ELogLevel.Debug);

            Result oResult = new Result();

            CandidateExamProcessDAO oCandidateExamProcessDAO = new CandidateExamProcessDAO();

            try
            {
                oResult = oCandidateExamProcessDAO.SaveCandidateAnswers(oCandidateForExam);
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultMessage = "Exception in Questions Save for Candidate..";
                oResult.ResultException = oEx;

                //new CLogger("Exception SaveCandidateAnswers CandidateExamProcessBO+BO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Exception SaveCandidateAnswers CandidateExamProcessBO+BO", ELogLevel.Debug, oEx);
            }

            //new CLogger("Out SaveCandidateAnswers CandidateExamProcessBO+BO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Out SaveCandidateAnswers CandidateExamProcessBO+BO", ELogLevel.Debug);

            return oResult;
        }
        /// <summary>
        /// This Method Load Question Categories With Type of an exam For A Candidate.
        /// For example: (Category: Math,IQ,English,etc...) (Only Two Type: Objective, Descriptive) 
        /// </summary>
        /// <param name="oCandidateForExam"> It takes CandidateForExam Object </param>
        /// <returns> It returns Result Object </returns>
        public Result LoadCategoriesWithType(CandidateForExam oCandidateForExam)
        {
            //new CLogger("Start LoadCategoriesWithType CandidateExamProcessDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start LoadCategoriesWithType CandidateExamProcessDAO+DAO", ELogLevel.Debug);

            logger.Info("Start LoadCategoriesWithType CandidateExamProcessDAO+DAO");

            Result oResult = new Result();
            DAOUtil oDAOUtil = new DAOUtil();

            SqlDataReader oSqlDataReader = null;

            String sSelect = String.Empty;

            List<CandidateMenu> oListCandidateMenu = new List<CandidateMenu>();

            try
            {
                sSelect = "select distinct EX_Category.CategoryID, EX_Category.CategoryName from"
                +" EX_Category inner join EX_Question on EX_Category.CategoryID=EX_Question.QuestionCategoryID"
                +" inner join EX_QuestionGeneration on EX_QuestionGeneration.QuestionID=EX_Question.QuestionID"
                + " where EX_QuestionGeneration.ExamID='" + oCandidateForExam.CadidateCandidateExam.CandiadteExamExam.ExamID + "'"
                +" order by EX_Category.CategoryID asc";

                oSqlDataReader = oDAOUtil.GetReader(sSelect);

                while (oSqlDataReader.Read())
                {
                    CandidateMenu oCandidateMenu = new CandidateMenu();

                    oCandidateMenu.CandidateMenuCategory.CategoryID = int.Parse(oSqlDataReader["CategoryID"].ToString());
                    oCandidateMenu.CandidateMenuCategory.CategoryName = oSqlDataReader["CategoryName"].ToString();

                    oListCandidateMenu.Add(oCandidateMenu);
                }

                oSqlDataReader.Close();

                foreach (CandidateMenu oCandidateMenuInList in oListCandidateMenu)
                {
                    sSelect = "select distinct EX_QuestionType.TypeID, EX_QuestionType.TypeName"
                    +" from EX_QuestionType inner join EX_Question on EX_QuestionType.TypeID=EX_Question.QuestionTypeID"
                    + " inner join EX_QuestionGeneration on EX_QuestionGeneration.QuestionID=EX_Question.QuestionID where EX_QuestionGeneration.ExamID='" + oCandidateForExam.CadidateCandidateExam.CandiadteExamExam.ExamID + "' and EX_Question.QuestionCategoryID ='" + oCandidateMenuInList.CandidateMenuCategory.CategoryID + "' order by EX_QuestionType.TypeID asc";

                    List<QuestionType> oListQuestionType = new List<QuestionType>();

                    oSqlDataReader = oDAOUtil.GetReader(sSelect);

                    while (oSqlDataReader.Read())
                    {
                        QuestionType oQuestionType = new QuestionType();

                        oQuestionType.QuestionTypeID = int.Parse(oSqlDataReader["TypeID"].ToString());
                        oQuestionType.QuestionTypeName = oSqlDataReader["TypeName"].ToString();

                        oListQuestionType.Add(oQuestionType);
                    }

                    oSqlDataReader.Close();

                    foreach (QuestionType oQuestionTypeInList in oListQuestionType)
                    {
                        sSelect = "select count(EX_Question.QuestionID) as TotalQuestions from EX_Question inner join EX_QuestionGeneration on EX_QuestionGeneration.QuestionID=EX_Question.QuestionID where EX_QuestionGeneration.ExamID='" + oCandidateForExam.CadidateCandidateExam.CandiadteExamExam.ExamID + "' and EX_Question.QuestionCategoryID ='" + oCandidateMenuInList.CandidateMenuCategory.CategoryID + "' and EX_Question.QuestionTypeID='" + oQuestionTypeInList.QuestionTypeID + "'";

                        oQuestionTypeInList.QuestionTypeTotalQuestions = int.Parse(oDAOUtil.GetExecuteScalar(sSelect).ToString());
                    }

                    oCandidateMenuInList.CandidateMenuCategoryQuestionType = oListQuestionType;
                }

                oResult.ResultObject = oListCandidateMenu;
                oResult.ResultMessage = "Candidate Menu Category with type Load Success...";
                oResult.ResultIsSuccess = true;
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultMessage = "Exception in Candidate Menu Category with type Load for Candidate...";
                oResult.ResultException = oEx;

                logger.Info("Exception LoadCategoriesWithType CandidateExamProcessDAO+DAO", oEx);

                //new CLogger("Exception LoadCategoriesWithType CandidateExamProcessDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Exception LoadCategoriesWithType CandidateExamProcessDAO+DAO", ELogLevel.Debug, oEx);
            }
            finally
            {
                if (oSqlDataReader!=null && !oSqlDataReader.IsClosed)
                {
                    oSqlDataReader.Close();
                }
            }

            //new CLogger("Out LoadCategoriesWithType CandidateExamProcessDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Out LoadCategoriesWithType CandidateExamProcessDAO+DAO", ELogLevel.Debug); ;

            logger.Info("End LoadCategoriesWithType CandidateExamProcessDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This Method save all answers of questions for an exam.
        /// This method is called when a candidate finish an exam
        /// </summary>
        /// <param name="oCandidateForExam"> It takes CandidateForExam Object </param>
        /// <returns> It returns Result Object </returns>
        public Result SaveCandidateAnswers(CandidateForExam oCandidateForExam)
        {
            //new CLogger("Start SaveCandidateAnswers CandidateExamProcessDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start SaveCandidateAnswers CandidateExamProcessDAO+DAO", ELogLevel.Debug);

            logger.Info("Start SaveCandidateAnswers CandidateExamProcessDAO+DAO");

            Result oResult = new Result();
            DAOUtil oDAOUtil = new DAOUtil();

            String sInsert = String.Empty;
            String sDesOrObj = String.Empty;

            List<String> oListString = new List<String>();

            try
            {
                foreach (CandidateAnswerQuestion oCandidateAnswerQuestion in oCandidateForExam.CadidateCandidateExam.CandidateAnsweredQuestions)
                {
                    if (oCandidateAnswerQuestion.QuestionForCandidateAnswer.QuestionQuestionType.QuestionTypeID == 0)
                    {
                        sDesOrObj = "Objective@";

                        foreach (Choice oChoice in oCandidateAnswerQuestion.QuestionForCandidateAnswer.QuestionObjectiveType.ListOfChoices)
                        {
                            sDesOrObj = sDesOrObj + oChoice.ChoiceIsValid.ToString()+":";
                        }
                    }
                    else
                    {
                        sDesOrObj = "Descriptive@"+oCandidateAnswerQuestion.DescriptiveQuestionAnswerText+":";
                    }

                    sInsert = "insert into EX_CandidateExam(ExamID,QuestionID,CandidateID,AnswerStringOrBits,AnswerAttachmentPath) values('" + oCandidateForExam.CadidateCandidateExam.CandiadteExamExam.ExamID + "','" + oCandidateAnswerQuestion.QuestionForCandidateAnswer.QuestionID + "','" + oCandidateForExam.CandidateForExamCandidate.CandidateCompositeID + "','" + sDesOrObj + "','" + oCandidateAnswerQuestion.sAnswerAttachFilePath + "')";
                    oListString.Add(sInsert);
                }

                if (oDAOUtil.ExecuteNonQuery(oListString))
                {
                    oResult.ResultIsSuccess = true;
                    oResult.ResultObject = oCandidateForExam;
                    oResult.ResultMessage = "Candidate Answer Save Success...";
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Candidate Answer Save Failed...";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultMessage = "Exception in Candidate Answer Save...";
                oResult.ResultException = oEx;

                logger.Info("Exception SaveCandidateAnswers CandidateExamProcessDAO+DAO", oEx);

                //new CLogger("Exception SaveCandidateAnswers CandidateExamProcessDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Exception SaveCandidateAnswers CandidateExamProcessDAO+DAO", ELogLevel.Debug, oEx);
            }

            //new CLogger("Out SaveCandidateAnswers CandidateExamProcessDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Out SaveCandidateAnswers CandidateExamProcessDAO+DAO", ELogLevel.Debug); ;

            logger.Info("End SaveCandidateAnswers CandidateExamProcessDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This Method Load Questions according to category, type for an exam.
        /// </summary>
        /// <param name="oCategory"> It takes Category Object </param>
        /// <param name="oQuestionType"> It takes QuestionType Object </param>
        /// <param name="oCandidateForExam"> It takes CandidateForExam Object </param>
        /// <returns> It returns Result Object </returns>
        public Result LoadQuestionsForACandidateInExamByCategoryAndType(Category oCategory, QuestionType oQuestionType, CandidateForExam oCandidateForExam)
        {
            logger.Info("Start LoadQuestionsForACandidateInExamByCategoryAndType CandidateExamProcessDAO+DAO");

            Result oResult = new Result();
            DAOUtil oDAOUtil = new DAOUtil();

            SqlDataReader oSqlDataReader = null;

            String sSelect = String.Empty;
            String sChoiceSelect = String.Empty;

            List<Question> oListQuestion = new List<Question>();
            List<CandidateAnswerQuestion> oListCandidateAnswerQuestion = new List<CandidateAnswerQuestion>();

            int i = 0;

            try
            {
                //sSelect = "select EX_Question.QuestionID,EX_Question.QuestionText,EX_Question.QuestionCreatorID,EX_Question.QuestionDefaultMark,EX_Question.QuestionCategoryID,EX_Question.QuestionTypeID from EX_QuestionGeneration inner join EX_Question on EX_QuestionGeneration.QuestionID=EX_Question.QuestionID where EX_QuestionGeneration.ExamID='" + oCandidate.CadidateCandidateExam.CandiadteExamExam.ExamID + "' order by EX_Question.QuestionCategoryID, EX_Question.QuestionTypeID asc";

                //sSelect = "select EX_Question.QuestionID,EX_Question.QuestionText,EX_Question.QuestionCreatorID,EX_QuestionGeneration.SetupQuestionMark,EX_Question.QuestionCategoryID,EX_Question.QuestionTypeID"
                //+" from EX_QuestionGeneration inner join EX_Question on EX_QuestionGeneration.QuestionID=EX_Question.QuestionID"
                //+" where EX_QuestionGeneration.ExamID='" + oCandidate.CadidateCandidateExam.CandiadteExamExam.ExamID + "' order by EX_Question.QuestionCategoryID, EX_Question.QuestionTypeID asc";

                sSelect = "select EX_Question.QuestionID,EX_Question.QuestionText,"
                +" EX_Question.QuestionCreatorID,EX_QuestionGeneration.SetupQuestionMark"
                +" ,EX_Question.QuestionCategoryID,EX_Question.QuestionTypeID"
                +" from EX_QuestionGeneration inner join EX_Question on EX_QuestionGeneration.QuestionID=EX_Question.QuestionID"
                +" where EX_QuestionGeneration.ExamID='" + oCandidateForExam.CadidateCandidateExam.CandiadteExamExam.ExamID + "'"
                +" and EX_Question.QuestionCategoryID='" + oCategory.CategoryID + "'"
                +" and EX_Question.QuestionTypeID='" + oQuestionType.QuestionTypeID + "'";

                oSqlDataReader = oDAOUtil.GetReader(sSelect);

                while (oSqlDataReader.Read())
                {
                    Question oQuestion = new Question();

                    oQuestion.QuestionID = new Guid(oSqlDataReader["QuestionID"].ToString());
                    oQuestion.QuestionText = oSqlDataReader["QuestionText"].ToString();
                    oQuestion.QuestionCreator.SystemUserID = new Guid(oSqlDataReader["QuestionCreatorID"].ToString());
                    oQuestion.QuestionDefaultMark = float.Parse(oSqlDataReader["SetupQuestionMark"].ToString());
                    oQuestion.QuestionCategory.CategoryID = int.Parse(oSqlDataReader["QuestionCategoryID"].ToString());
                    oQuestion.QuestionQuestionType.QuestionTypeID = int.Parse(oSqlDataReader["QuestionTypeID"].ToString());

                    oListQuestion.Add(oQuestion);
                }

                oSqlDataReader.Close();

                foreach (Question oQuestionForChoice in oListQuestion)
                {
                    if (oQuestionForChoice.QuestionQuestionType.QuestionTypeID == 0)
                    {
                        sChoiceSelect = "select ObjectiveAnswer,ObjectiveAnswerIsValid from EX_Objective where ObjectiveQuestionID='" + oQuestionForChoice.QuestionID + "'";

                        List<Choice> oListChoice = new List<Choice>();

                        oSqlDataReader = oDAOUtil.GetReader(sChoiceSelect);

                        while (oSqlDataReader.Read())
                        {
                            //prepare the choices for a particular questtion......
                            //and populate oListQuestion
                            Choice oChoice = new Choice();

                            oChoice.ChoiceName = oSqlDataReader["ObjectiveAnswer"].ToString();
                            //oChoice.ChoiceIsValid = Convert.ToBoolean(oSqlDataReader["ObjectiveAnswerIsValid"].ToString());
                            oChoice.ChoiceIsValid = false;

                            oListChoice.Add(oChoice);
                        }

                        oSqlDataReader.Close();

                        oQuestionForChoice.QuestionObjectiveType.ListOfChoices = oListChoice;
                    }
                }

                for (i = 0; i < oListQuestion.Count; i++)
                {
                    CandidateAnswerQuestion oCandidateAnswerQuestion = new CandidateAnswerQuestion();
                    oCandidateAnswerQuestion.QuestionForCandidateAnswer = oListQuestion[i];
                    oListCandidateAnswerQuestion.Add(oCandidateAnswerQuestion);
                }

                oResult.ResultObject = oListCandidateAnswerQuestion;
                oResult.ResultMessage = "Load Question for Exam Success...";
                oResult.ResultIsSuccess = true;
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultMessage = "Exception in Question Load for Exam...";
                oResult.ResultException = oEx;

                logger.Info("Exception LoadQuestionsForACandidateInExamByCategoryAndType CandidateExamProcessDAO+DAO", oEx);
            }
            finally
            {
                if (oSqlDataReader != null && !oSqlDataReader.IsClosed)
                {
                    oSqlDataReader.Close();
                }
            }

            logger.Info("End LoadQuestionsForACandidateInExamByCategoryAndType CandidateExamProcessDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This method Load Candidates According to SystemUser to evaluate candidates
        /// That means, if a system user setup questions for an exam then he can evaluate candidates 
        /// Administrator can always evaluate candidates.
        /// </summary>
        /// <param name="oSystemUser"> It takes SystemUser Object </param>
        /// <param name="oExam"> It takes Exam Object </param>
        /// <returns> It returns Result Object </returns>
        public Result LoadCandidatesAccordingToSystemUserForEvaluate(SystemUser oSystemUser, Exam oExam)
        {
            //new CLogger("Start LoadCandidatesAccordingToSystemUserForEvaluate EvaluateProcessDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start LoadCandidatesAccordingToSystemUserForEvaluate EvaluateProcessDAO+DAO", ELogLevel.Debug);

            logger.Info("Start LoadCandidatesAccordingToSystemUserForEvaluate EvaluateProcessDAO+DAO");

            Result oResult = new Result();
            DAOUtil oDAOUtil = new DAOUtil();

            SqlDataReader oSqlDataReader = null;

            List<CandidateForExam> oListCandidateForExam = new List<CandidateForExam>();

            String sSelect = String.Empty;

            try
            {
                if (oSystemUser.SystemUserName.ToLower().Equals("administrator"))
                {
                    //sSelect = "select distinct EX_Candidate.ExamID,EX_Candidate.CompositeCandidateID,EX_Candidate.CandidatePassword,EX_Candidate.Name,EX_Candidate.LastResult,EX_Candidate.LastInstitution,EX_Candidate.LastPassingYear,CvPath from EX_Candidate inner join EX_CandidateExam on EX_Candidate.CompositeCandidateID = EX_CandidateExam.CandidateID where EX_Candidate.ExamID='" + oExam.ExamID + "' and EX_Candidate.ExamID in (select EX_QuestionGeneration.ExamID from EX_QuestionGeneration where EX_QuestionGeneration.ExamID='" + oExam.ExamID + "')";
                    sSelect = "select distinct EX_CandidateForExam.ExamID,EX_Candidate.CompositeCandidateID,EX_Candidate.CandidatePassword,EX_Candidate.Name,EX_Candidate.LastResult,EX_Candidate.LastInstitution,EX_Candidate.LastPassingYear,EX_Candidate.CvPath"
                    + " from EX_Candidate inner join EX_CandidateForExam on EX_Candidate.CompositeCandidateID=EX_CandidateForExam.CandidateID"
                    + " inner join EX_CandidateExam on EX_CandidateForExam.ExamID=EX_CandidateExam.ExamID where EX_CandidateExam.ExamID='" + oExam.ExamID + "'"
                    + " and EX_CandidateForExam.CandidateID=EX_CandidateExam.CandidateID"
                    + " and EX_CandidateExam.ExamID in (select EX_QuestionGeneration.ExamID from EX_QuestionGeneration where EX_QuestionGeneration.ExamID='" + oExam.ExamID + "')";
                }
                else
                {
                    //sSelect = "select distinct EX_Candidate.ExamID,EX_Candidate.CompositeCandidateID,EX_Candidate.CandidatePassword,EX_Candidate.Name,EX_Candidate.LastResult,EX_Candidate.LastInstitution,EX_Candidate.LastPassingYear,CvPath from EX_Candidate inner join EX_CandidateExam on EX_Candidate.CompositeCandidateID = EX_CandidateExam.CandidateID where EX_Candidate.ExamID='" + oExam.ExamID + "' and EX_Candidate.ExamID in (select EX_QuestionGeneration.ExamID from EX_QuestionGeneration where EX_QuestionGeneration.ExamID='" + oExam.ExamID + "' and EX_QuestionGeneration.GeneratorID='" + oSystemUser.SystemUserID + "')";
                    sSelect = "select distinct EX_CandidateForExam.ExamID,EX_Candidate.CompositeCandidateID,EX_Candidate.CandidatePassword,EX_Candidate.Name,EX_Candidate.LastResult,EX_Candidate.LastInstitution,EX_Candidate.LastPassingYear,EX_Candidate.CvPath"
                    + " from EX_Candidate inner join EX_CandidateForExam on EX_Candidate.CompositeCandidateID=EX_CandidateForExam.CandidateID"
                    + " inner join EX_CandidateExam on EX_CandidateForExam.ExamID=EX_CandidateExam.ExamID where EX_CandidateExam.ExamID='" + oExam.ExamID + "'"
                    + " and EX_CandidateForExam.CandidateID=EX_CandidateExam.CandidateID"
                    + " and EX_CandidateExam.ExamID in (select EX_QuestionGeneration.ExamID from EX_QuestionGeneration where EX_QuestionGeneration.ExamID='" + oExam.ExamID + "' and EX_QuestionGeneration.GeneratorID='" + oSystemUser.SystemUserID + "')";
                }

                oSqlDataReader = oDAOUtil.GetReader(sSelect);

                while(oSqlDataReader.Read())
                {
                    CandidateForExam oCandidateForExam = new CandidateForExam();

                    oCandidateForExam.CadidateCandidateExam.CandiadteExamExam.ExamID = new Guid(oSqlDataReader["ExamID"].ToString());
                    oCandidateForExam.CandidateForExamCandidate.CandidateCompositeID = oSqlDataReader["CompositeCandidateID"].ToString();
                    oCandidateForExam.CandidateForExamCandidate.CandidatePassword = oSqlDataReader["CandidatePassword"].ToString();
                    oCandidateForExam.CandidateForExamCandidate.CandidateName = oSqlDataReader["Name"].ToString();
                    oCandidateForExam.CandidateForExamCandidate.CandidateLastResult = float.Parse(oSqlDataReader["LastResult"].ToString());
                    oCandidateForExam.CandidateForExamCandidate.CandiadteLastInstitution = oSqlDataReader["LastInstitution"].ToString();
                    oCandidateForExam.CandidateForExamCandidate.CandidateLastPassingYear = int.Parse(oSqlDataReader["LastPassingYear"].ToString());
                    oCandidateForExam.CandidateForExamCandidate.CandidateCvPath = oSqlDataReader["CvPath"].ToString();

                    oListCandidateForExam.Add(oCandidateForExam);
                }

                oSqlDataReader.Close();

                oResult.ResultObject = oListCandidateForExam;
                oResult.ResultMessage = "LoadCandidatesAccordingToSystemUserForEvaluate Success...";
                oResult.ResultIsSuccess = true;
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "LoadCandidatesAccordingToSystemUserForEvaluate Exception...";

                logger.Info("Exception LoadCandidatesAccordingToSystemUserForEvaluate EvaluateProcessDAO+DAO", oEx);

                //new CLogger("Exception LoadCandidatesAccordingToSystemUserForEvaluate EvaluateProcessDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Exception LoadCandidatesAccordingToSystemUserForEvaluate EvaluateProcessDAO+DAO", ELogLevel.Debug, oEx);
            }
            finally
            {
                if (oSqlDataReader!=null && !oSqlDataReader.IsClosed)
                {
                    oSqlDataReader.Close();
                }
            }

            //new CLogger("Out LoadCandidatesAccordingToSystemUserForEvaluate EvaluateProcessDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Out LoadCandidatesAccordingToSystemUserForEvaluate EvaluateProcessDAO+DAO", ELogLevel.Debug); ;

            logger.Info("End LoadCandidatesAccordingToSystemUserForEvaluate EvaluateProcessDAO+DAO");

            return oResult;
        }
    protected void btn_Setup_Click(object sender, EventArgs e)
    {
        try
        {
            Result oResult = new Result();
            Candidate oCandidate = new Candidate();
            CandidateForExam oCandidateForExam = new CandidateForExam();
            CandidateBO oCandidateBO = new CandidateBO();
            Exam oExam = new Exam();

            oExam =(Exam)Utils.GetSession(SessionManager.csSelectedExam);

            if (IsValidCandidateName(txt_CandidateName.Text) && IsValidLastResult(txt_MarkOrCG.Text) && IsValidLastResultRange(txt_MarkOrCG.Text,txtOutOf.Text) && IsValidLastInstitution(txt_LastInstitution.Text) && IsValidLastPassingYear(txt_LastPassingYear.Text) && IsValidCV(fup_ccandidateCv) && IsValidSelection(dr_SelectCGOrMark.SelectedValue) && IsBeforeExamStarted(oExam) && IsValidEmail(txt_Email.Text))
            {
                oCandidate.CandidateCompositeID = txt_CandidateName.Text + DateTime.Now.Ticks.ToString();
                //oCandidate.CadidateCandidateExam.CandiadteExamExam = oExam;
                oCandidate.CandiadteLastInstitution = txt_LastInstitution.Text;
                oCandidate.CandidateName = txt_CandidateName.Text;
                oCandidate.CandidateCvPath = oExam.ExamName + "\\" + oCandidate.CandidateCompositeID.ToString()+"_" + fup_ccandidateCv.FileName; // this partially CV path
                oCandidate.CandidateLastPassingYear = int.Parse(txt_LastPassingYear.Text);
                oCandidate.CandidateLastResult = float.Parse(txt_MarkOrCG.Text);
                oCandidate.CandidatePassword = txt_CandidateName.Text.Substring(0, 2) + "@123";
                oCandidate.CandidateEmail = txt_Email.Text;
                oCandidate.CandidateLastResultRange = float.Parse(txtOutOf.Text);
                oCandidate.LastResultTypaName = dr_SelectCGOrMark.SelectedValue;

                if (!Directory.Exists(DirectoryManager.csCandidateCVDirectory + oExam.ExamName + "\\"))
                {
                    Directory.CreateDirectory(DirectoryManager.csCandidateCVDirectory + oExam.ExamName + "\\");
                }

                if (IsValidCandidatePhoto(fup_CandidatePhoto))
                {
                    oCandidate.CandidatePicturePath = oExam.ExamName + "\\" + oCandidate.CandidateCompositeID.ToString() + "_" + fup_CandidatePhoto.FileName;

                    fup_CandidatePhoto.SaveAs(DirectoryManager.csCandidateCVDirectory + oCandidate.CandidatePicturePath);
                }

                oCandidateForExam.CadidateCandidateExam.CandiadteExamExam = oExam;
                oCandidateForExam.CandidateForExamCandidate = oCandidate;

                fup_ccandidateCv.SaveAs(DirectoryManager.csCandidateCVDirectory + oCandidate.CandidateCvPath);

                oResult = oCandidateBO.CandidateSetup(oCandidateForExam);

                if (oResult.ResultIsSuccess)
                {
                    if (rdoEmaiSendNotSend.SelectedValue.Equals("Send ID & Password"))
                    {
                        Object[] oObjArr = new Object[2];
                        oObjArr[0] = oExam;
                        oObjArr[1] = oCandidate;

                        object oObject = new object();
                        oObject = oObjArr;

                        ThreadPool.QueueUserWorkItem(new WaitCallback(SendMailToCandidate), oObject);
                    }
                    else if (rdoEmaiSendNotSend.SelectedValue.Equals("Dont Send"))
                    {

                    }

                    lbl_error.ForeColor = Color.Green;
                    lbl_error.Text = oResult.ResultMessage;

                    clearControlValue();
                }
                else
                {
                    if(File.Exists(DirectoryManager.csCandidateCVDirectory + oCandidate.CandidateCvPath))
                    {
                        File.Delete(DirectoryManager.csCandidateCVDirectory + oCandidate.CandidateCvPath);
                    }

                    lbl_error.ForeColor = Color.Red;
                    lbl_error.Text = oResult.ResultMessage;
                }
            }
            else
            {
                if (!IsBeforeExamStarted(oExam))
                {
                    lbl_error.ForeColor = Color.Red;
                    lbl_error.Text = "Setup Candidate Before Exam Started.";
                }
                else
                {
                    if (!IsValidLastPassingYear(txt_LastPassingYear.Text))
                    {
                        lbl_error.ForeColor = Color.Red;
                        lbl_error.Text = "Passing year must be less than or equal currnet year";
                    }
                    if(!IsValidCV(fup_ccandidateCv))
                    {
                        lbl_error.ForeColor = Color.Red;
                        lbl_error.Text = lbl_error.Text + "<br/>Valid CV Extension(.html,.htm,.doc,.pdf,.rtf)";
                    }
                    if (!IsValidCandidatePhoto(fup_CandidatePhoto))
                    {
                        lbl_error.ForeColor = Color.Red;
                        lbl_error.Text = lbl_error.Text + "<br/>Valid Photo Extension(.gif,.png,.jpg,.jpeg,.bmp)";
                    }
                    //if(!IsValidCV(fup_ccandidateCv) || !IsValidCandidatePhoto(fup_CandidatePhoto))
                    //{
                    //    lbl_error.ForeColor = Color.Red;
                    //    lbl_error.Text = "- is not allowed. Valid CV Extension(.html,.htm,.doc,.pdf,.rtf)" + "<br/>" + "- is not allowed. Valid Image Extension(.gif,.png,.jpg,.jpeg,.bmp)";
                    //}
                }
            }
        }
        catch (Exception oEx)
        {
            lbl_error.ForeColor = Color.Red;
            lbl_error.Text = "Exception occured during Candidate Setup.";
        }
    }
        /// <summary>
        /// This Method Show All Candidates with their information for an Exam. 
        /// </summary>
        /// <param name="oExam"> It takes Exam Object </param>
        /// <returns> It returns Result Object </returns>
        public Result ShowAllCandidates(Exam oExam)
        {
            //new CLogger("Start ShowAllCandidates CandidateDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start ShowAllCandidates CandidateDAO+DAO", ELogLevel.Debug);

            logger.Info("Start ShowAllCandidates CandidateDAO+DAO");

            Result oResult = new Result();
            DAOUtil oDAOUtil = new DAOUtil();

            List<CandidateForExam> oListCandidateForExam = new List<CandidateForExam>();

            String sSelect = String.Empty;

            SqlDataReader oSqlDataReader = null;

            try
            {
                sSelect = "select EX_CandidateForExam.ExamID,CompositeCandidateID,CandidatePassword,Name,"
                + " LastResult,LastResultRange,LastResultTypeName,LastInstitution,LastPassingYear,CvPath,EmailAddress,CandidatePicturePath"
                +" from EX_Candidate inner join EX_CandidateForExam on EX_Candidate.CompositeCandidateID=EX_CandidateForExam.CandidateID"
                +" where EX_CandidateForExam.ExamID='" + oExam.ExamID + "'";

                oSqlDataReader = oDAOUtil.GetReader(sSelect);

                while (oSqlDataReader.Read())
                {
                    CandidateForExam oCandidateForExam = new CandidateForExam();

                    oCandidateForExam.CadidateCandidateExam.CandiadteExamExam.ExamID = new Guid(oSqlDataReader["ExamID"].ToString());
                    oCandidateForExam.CandidateForExamCandidate.CandidateCompositeID = oSqlDataReader["CompositeCandidateID"].ToString();
                    oCandidateForExam.CandidateForExamCandidate.CandidatePassword = oSqlDataReader["CandidatePassword"].ToString();
                    oCandidateForExam.CandidateForExamCandidate.CandidateName = oSqlDataReader["Name"].ToString();
                    oCandidateForExam.CandidateForExamCandidate.CandidateLastResult = float.Parse(oSqlDataReader["LastResult"].ToString());
                    oCandidateForExam.CandidateForExamCandidate.CandiadteLastInstitution = oSqlDataReader["LastInstitution"].ToString();
                    oCandidateForExam.CandidateForExamCandidate.CandidateLastPassingYear = int.Parse(oSqlDataReader["LastPassingYear"].ToString());
                    oCandidateForExam.CandidateForExamCandidate.CandidateCvPath = oSqlDataReader["CvPath"].ToString();
                    oCandidateForExam.CandidateForExamCandidate.CandidateEmail = oSqlDataReader["EmailAddress"].ToString();

                    oCandidateForExam.CandidateForExamCandidate.CandidateLastResultRange = float.Parse(oSqlDataReader["LastResultRange"].ToString());
                    oCandidateForExam.CandidateForExamCandidate.LastResultTypaName = oSqlDataReader["LastResultTypeName"].ToString();
                    oCandidateForExam.CandidateForExamCandidate.CandidatePicturePath = oSqlDataReader["CandidatePicturePath"].ToString();

                    oListCandidateForExam.Add(oCandidateForExam);
                }

                oSqlDataReader.Close();

                oResult.ResultObject = oListCandidateForExam;
                oResult.ResultMessage = "Candidate Load Success...";
                oResult.ResultIsSuccess = true;
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultMessage = "Candidate Load Failed...";
                oResult.ResultException = oEx;

                logger.Info("Exception ShowAllCandidates CandidateDAO+DAO", oEx);

                //new CLogger("Exception ShowAllCandidates CandidateDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Exception ShowAllCandidates CandidateDAO+DAO", ELogLevel.Debug, oEx);
            }
            finally
            {
                if (oSqlDataReader!=null && !oSqlDataReader.IsClosed)
                {
                    oSqlDataReader.Close();
                }
            }

            //new CLogger("Out ShowAllCandidates CandidateDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Out ShowAllCandidates CandidateDAO+DAO", ELogLevel.Debug);

            logger.Info("End ShowAllCandidates CandidateDAO+DAO");

            return oResult;
        }
        //r
        /// <summary>
        /// This Method Setup Candidate for an exam.
        /// </summary>
        /// <param name="oCandidateForExam"> It takes CandidateForExam Object </param>
        /// <returns> It returns Result Object </returns>
        public Result CandidateSetup(CandidateForExam oCandidateForExam)
        {
            //new CLogger("Start CandidateSetup CandidateDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start CandidateSetup CandidateDAO+DAO", ELogLevel.Debug);

            logger.Info("Start CandidateSetup CandidateDAO+DAO");

            Result oResult = new Result();
            DAOUtil oDAOUtil = new DAOUtil();

            String sInsert = String.Empty;

            //List<String> oListString = new List<String>();

            SqlCommand oSqlCommand = null;

            List<SqlCommand> oListSqlCommand = new List<SqlCommand>();
            List<int> oListInt = new List<int>();

            try
            {
                //sInsert = "DECLARE @rows int SET @rows = (SELECT  max(CandidateIDInt) from EX_Candidate) if @rows is null insert into EX_Candidate(ExamID,CompositeCandidateID,CandidatePassword,Name,LastResult,LastInstitution,LastPassingYear,CvPath,CandidateID) values('" + oCandidate.CadidateCandidateExam.CandiadteExamExam.ExamID + "','" + oCandidate.CandidateName + "_1','" + oCandidate.CandidateName + "_1','" + oCandidate.CandidateName + "','" + oCandidate.CandidateLastResult + "','" + oCandidate.CandiadteLastInstitution + "','" + oCandidate.CandidateLastPassingYear + "','" + oCandidate.CandidateCvPath + "','" + oCandidate.CandidateID + "')  else insert into EX_Candidate(ExamID,CompositeCandidateID,CandidatePassword,Name,LastResult,LastInstitution,LastPassingYear,CvPath,CandidateID) values('" + oCandidate.CadidateCandidateExam.CandiadteExamExam.ExamID + "','" + oCandidate.CandidateName + "_'" + "+Convert(varchar(50),@rows+1),'" + oCandidate.CandidateName + "_'" + "+Convert(varchar(50),@rows+1),'" + oCandidate.CandidateName + "','" + oCandidate.CandidateLastResult + "','" + oCandidate.CandiadteLastInstitution + "','" + oCandidate.CandidateLastPassingYear + "','" + oCandidate.CandidateCvPath + "','" + oCandidate.CandidateID + "')";     //values('abc' + Convert(varchar(50),@rows+1))";

                //sInsert = "insert into EX_Candidate(CompositeCandidateID,CandidatePassword,Name,LastResult,LastInstitution,LastPassingYear,CvPath,EmailAddress,LastResultRange,LastResultTypeName,CandidatePicturePath) values('" + oCandidateForExam.CandidateForExamCandidate.CandidateCompositeID + "','" + oCandidateForExam.CandidateForExamCandidate.CandidatePassword + "','" + oCandidateForExam.CandidateForExamCandidate.CandidateName + "','" + oCandidateForExam.CandidateForExamCandidate.CandidateLastResult + "','" + oCandidateForExam.CandidateForExamCandidate.CandiadteLastInstitution + "','" + oCandidateForExam.CandidateForExamCandidate.CandidateLastPassingYear + "','" + oCandidateForExam.CandidateForExamCandidate.CandidateCvPath + "','" + oCandidateForExam.CandidateForExamCandidate.CandidateEmail + "','" + oCandidateForExam.CandidateForExamCandidate.CandidateLastResultRange + "','" + oCandidateForExam.CandidateForExamCandidate.LastResultTypaName + "','" + oCandidateForExam.CandidateForExamCandidate.CandidatePicturePath + "')";
                //oListString.Add(sInsert);
                //sInsert = "insert into EX_CandidateForExam(CandidateID,ExamID) values('" + oCandidateForExam.CandidateForExamCandidate.CandidateCompositeID + "','" + oCandidateForExam.CadidateCandidateExam.CandiadteExamExam.ExamID + "')";
                //oListString.Add(sInsert);

                //if (oDAOUtil.ExecuteNonQuery(oListString))
                //{
                //    oResult.ResultMessage = "Candidate Setup Success...";
                //    oResult.ResultObject = oCandidateForExam;
                //    oResult.ResultIsSuccess = true;
                //}
                //else
                //{
                //    oResult.ResultIsSuccess = false;
                //    oResult.ResultMessage = "Candidate Setup Failed...";
                //}

                oSqlCommand = new SqlCommand("SP_CandidateSetup");
                oSqlCommand.CommandType = CommandType.StoredProcedure;

                oSqlCommand.Parameters.Add("@CompositeCandidateID", SqlDbType.VarChar);
                oSqlCommand.Parameters["@CompositeCandidateID"].Value = oCandidateForExam.CandidateForExamCandidate.CandidateCompositeID;

                oSqlCommand.Parameters.Add("@CandidatePassword", SqlDbType.VarChar);
                oSqlCommand.Parameters["@CandidatePassword"].Value = oCandidateForExam.CandidateForExamCandidate.CandidatePassword;

                oSqlCommand.Parameters.Add("@Name", SqlDbType.VarChar);
                oSqlCommand.Parameters["@Name"].Value = oCandidateForExam.CandidateForExamCandidate.CandidateName;

                oSqlCommand.Parameters.Add("@LastResult", SqlDbType.Float);
                oSqlCommand.Parameters["@LastResult"].Value = oCandidateForExam.CandidateForExamCandidate.CandidateLastResult;

                oSqlCommand.Parameters.Add("@LastInstitution", SqlDbType.VarChar);
                oSqlCommand.Parameters["@LastInstitution"].Value = oCandidateForExam.CandidateForExamCandidate.CandiadteLastInstitution;

                oSqlCommand.Parameters.Add("@LastPassingYear", SqlDbType.Int);
                oSqlCommand.Parameters["@LastPassingYear"].Value = oCandidateForExam.CandidateForExamCandidate.CandidateLastPassingYear;

                oSqlCommand.Parameters.Add("@CvPath", SqlDbType.VarChar);
                oSqlCommand.Parameters["@CvPath"].Value = oCandidateForExam.CandidateForExamCandidate.CandidateCvPath;

                oSqlCommand.Parameters.Add("@EmailAddress", SqlDbType.VarChar);
                oSqlCommand.Parameters["@EmailAddress"].Value = oCandidateForExam.CandidateForExamCandidate.CandidateEmail;

                oSqlCommand.Parameters.Add("@LastResultRange", SqlDbType.Float);
                oSqlCommand.Parameters["@LastResultRange"].Value = oCandidateForExam.CandidateForExamCandidate.CandidateLastResultRange;

                oSqlCommand.Parameters.Add("@LastResultTypeName", SqlDbType.VarChar);
                oSqlCommand.Parameters["@LastResultTypeName"].Value = oCandidateForExam.CandidateForExamCandidate.LastResultTypaName;

                oSqlCommand.Parameters.Add("@CandidatePicturePath", SqlDbType.VarChar);
                oSqlCommand.Parameters["@CandidatePicturePath"].Value = oCandidateForExam.CandidateForExamCandidate.CandidatePicturePath;

                oSqlCommand.Parameters.Add("@CandidateID", SqlDbType.VarChar);
                oSqlCommand.Parameters["@CandidateID"].Value = oCandidateForExam.CandidateForExamCandidate.CandidateCompositeID;

                oSqlCommand.Parameters.Add("@ExamID", SqlDbType.UniqueIdentifier);
                oSqlCommand.Parameters["@ExamID"].Value = oCandidateForExam.CadidateCandidateExam.CandiadteExamExam.ExamID;

                oListSqlCommand.Add(oSqlCommand);

                oListInt = oDAOUtil.ExecuteNonQueryForStoredProcedure(oListSqlCommand);

                if (oListInt.Count > 0)
                {
                    if (oListInt[0] > 0 )
                    {
                        oResult.ResultMessage = "Candidate Setup Success...";
                        oResult.ResultObject = oCandidateForExam;
                        oResult.ResultIsSuccess = true;
                    }
                    else
                    {
                        oResult.ResultIsSuccess = false;
                        oResult.ResultMessage = "Duplicate Candidate Email not allowed...";
                    }
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Candidate Setup Failed...";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Candidate Setup Exception...";

                logger.Info("Exception CandidateSetup CandidateDAO+DAO", oEx);

                //new CLogger("Exception CandidateSetup CandidateDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Exception CandidateSetup CandidateDAO+DAO", ELogLevel.Debug, oEx);
            }

            //new CLogger("Out CandidateSetup CandidateDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Out CandidateSetup CandidateDAO+DAO", ELogLevel.Debug); ;

            logger.Info("End CandidateSetup CandidateDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This Method varifies CandidateLogin. If he is not appeared for an exam then Login is success. 
        /// He must login between an exam duration
        /// </summary>
        /// <param name="oCandidate"> It takes Candidate Object </param>
        /// <returns> It returns Result Object </returns>
        public Result CandidateLogin(Candidate oCandidate)
        {
            //new CLogger("Start CandidateLogin CandidateDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start CandidateLogin CandidateDAO+DAO", ELogLevel.Debug);

            logger.Info("Start CandidateLogin CandidateDAO+DAO");

            Result oResult = new Result();
            //Candidate oPopulatedCandidate = new Candidate();
            CandidateForExam oCandidateForExam = new CandidateForExam();
            Exam oPopulatedExam = new Exam();
            DAOUtil oDAOUtil = new DAOUtil();

            String sSelect = String.Empty;

            SqlDataReader oSqlDataReader = null;

            bool bIsCandidateFound = false;
            bool bIsBetweenLoginTime = false;

            //sSelect = "select EX_Exam.ExamDateWithTime,EX_Exam.ExamDuration,EX_Candidate.ExamID,EX_Candidate.CompositeCandidateID,EX_Candidate.CandidatePassword,EX_Candidate.Name,EX_Candidate.LastResult,EX_Candidate.LastInstitution,EX_Candidate.LastPassingYear,EX_Candidate.CvPath,EX_Candidate.CandidateIDInt,EX_Candidate.CandidateID from EX_Candidate,EX_Exam where ExamID in (select ExamID from EX_Candidate where EX_Candidate.CompositeCandidateID='" + oCandidate.CandidateCompositeID + "' and EX_Candidate.CandidatePassword='******')";

            //sSelect = "select EX_Exam.ExamName,EX_Exam.ExamDateWithTime,EX_Exam.ExamDuration,EX_Exam.ExamTotalMarks,EX_Exam.ExamConstraint,EX_Exam.ExamID,"
            //+" EX_Candidate.CompositeCandidateID,EX_Candidate.CandidatePassword,EX_Candidate.Name,EX_Candidate.LastResult,EX_Candidate.LastInstitution,EX_Candidate.LastPassingYear,EX_Candidate.CvPath"
            //+" from EX_Candidate inner join EX_CandidateForExam on EX_Candidate.CompositeCandidateID=EX_CandidateForExam.CandidateID"
            //+" inner join EX_Exam on EX_CandidateForExam.ExamID=EX_Exam.ExamID"
            //+" where EX_Candidate.EmailAddress='" + oCandidate.CandidateEmail + "' and EX_Candidate.CandidatePassword='******'"
            //+" and EX_Candidate.CompositeCandidateID not in"
            //+" (select EX_CandidateExam.CandidateID from"
            //+" EX_Candidate inner join EX_CandidateForExam on EX_Candidate.CompositeCandidateID =EX_CandidateForExam.CandidateID"
            //+" inner join EX_CandidateExam on EX_CandidateForExam.ExamID=EX_CandidateExam.ExamID"
            //+" where EX_Candidate.EmailAddress='" + oCandidate.CandidateEmail + "')";

            sSelect = " select EX_Exam.ExamName,EX_Exam.ExamDateWithTime,EX_Exam.ExamDuration,EX_Exam.ExamTotalMarks,"
            + " EX_Exam.ExamConstraint,EX_Exam.ExamID, EX_Candidate.CompositeCandidateID,EX_Candidate.CandidatePassword,"
            + " EX_Candidate.Name,EX_Candidate.LastResult,EX_Candidate.LastInstitution,EX_Candidate.LastPassingYear,EX_Candidate.CvPath"
            + " from EX_Candidate inner join EX_CandidateForExam on EX_Candidate.CompositeCandidateID=EX_CandidateForExam.CandidateID"
            + " inner join EX_Exam on EX_CandidateForExam.ExamID=EX_Exam.ExamID"
            + " where EX_Candidate.EmailAddress='" + oCandidate.CandidateEmail + "' and"
            + " EX_Candidate.CandidatePassword='******' and EX_CandidateForExam.CandidateID not in"
            + " (select EX_CandidateExam.CandidateID from EX_CandidateExam where"
            + " EX_CandidateExam.ExamID=EX_CandidateForExam.ExamID and EX_CandidateExam.CandidateID=EX_CandidateForExam.CandidateID)";

            try
            {
                DateTime oDateTime = DateTime.MinValue;
                float fDuration = 0f;
                Guid gExamID = Guid.Empty;

                oSqlDataReader = oDAOUtil.GetReader(sSelect);

                while (oSqlDataReader.Read())
                {
                    oDateTime =  DateTime.Parse(oSqlDataReader["ExamDateWithTime"].ToString());
                    fDuration = float.Parse(oSqlDataReader["ExamDuration"].ToString());
                    gExamID = new Guid(oSqlDataReader["ExamID"].ToString());

                    oPopulatedExam.ExamID = gExamID;
                    oPopulatedExam.ExamConstraint = int.Parse(oSqlDataReader["ExamConstraint"].ToString());
                    oPopulatedExam.ExamTotalMarks = int.Parse(oSqlDataReader["ExamTotalMarks"].ToString());
                    oPopulatedExam.ExamDateWithStartingTime = oDateTime;
                    oPopulatedExam.ExamDurationinHour = fDuration;
                    oPopulatedExam.ExamName = oSqlDataReader["ExamName"].ToString();

                    oCandidateForExam.CadidateCandidateExam.CandiadteExamExam = oPopulatedExam;

                    oCandidateForExam.CandidateForExamCandidate.CandidateCompositeID = oSqlDataReader["CompositeCandidateID"].ToString();
                    oCandidateForExam.CandidateForExamCandidate.CandidatePassword = oSqlDataReader["CandidatePassword"].ToString();
                    oCandidateForExam.CandidateForExamCandidate.CandidateName = oSqlDataReader["Name"].ToString();
                    oCandidateForExam.CandidateForExamCandidate.CandidateLastResult = float.Parse(oSqlDataReader["LastResult"].ToString());
                    oCandidateForExam.CandidateForExamCandidate.CandiadteLastInstitution = oSqlDataReader["LastInstitution"].ToString();
                    oCandidateForExam.CandidateForExamCandidate.CandidateLastPassingYear = int.Parse(oSqlDataReader["LastPassingYear"].ToString());
                    oCandidateForExam.CandidateForExamCandidate.CandidateCvPath = oSqlDataReader["CvPath"].ToString();

                    if (oDateTime != null && fDuration > 0f)
                    {
                        TimeSpan oTimeSpan = new TimeSpan();

                        oTimeSpan = oCandidate.CandidateLoginTime - oDateTime;

                        Double dTimeDifference = oTimeSpan.TotalHours;

                        if ((float)dTimeDifference < fDuration && (float)dTimeDifference >= 0f)
                        {
                            //oResult.ResultMessage = "Candidate Login Success...";
                            //oResult.ResultObject = oCandidateForExam;
                            //oResult.ResultIsSuccess = true;
                            bIsCandidateFound = true;
                            bIsBetweenLoginTime = true;
                            break;
                        }
                        //else
                        //{
                        //    bIsCandidateFound = true;
                        //}
                    }
                }

                oSqlDataReader.Close();

                if (bIsCandidateFound && bIsBetweenLoginTime)
                {
                    oResult.ResultMessage = "Candidate Login Success...";
                    oResult.ResultObject = oCandidateForExam;
                    oResult.ResultIsSuccess = true;
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Candidate not found...";
                }
                //else if (bIsCandidateFound && !bIsBetweenLoginTime)
                //{
                //    oResult.ResultIsSuccess = false;
                //    oResult.ResultMessage = "Login Between Exam Time...";
                //}
                //else if (!bIsCandidateFound)
                //{
                //    oResult.ResultIsSuccess = false;
                //    oResult.ResultMessage = "Candidate not found...";
                //}

                //if (oDateTime != null && fDuration > 0f)
                //{
                //    TimeSpan oTimeSpan = new TimeSpan();

                //    oTimeSpan = oCandidate.CandidateLoginTime - oDateTime;

                //    Double dTimeDifference=oTimeSpan.TotalHours;

                //    if ((float)dTimeDifference < fDuration && (float)dTimeDifference >= 0f)
                //    {
                //        oResult.ResultMessage = "Candidate Login Success...";
                //        oResult.ResultObject = oCandidateForExam;
                //        oResult.ResultIsSuccess = true;
                //    }
                //    else
                //    {
                //        oResult.ResultIsSuccess = false;
                //        oResult.ResultMessage = "Login between Exam time...";
                //    }
                //}
                //else
                //{
                //    oResult.ResultIsSuccess = false;
                //    oResult.ResultMessage = "Candidate not found...";
                //}
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Candidate Login Exception...";

                logger.Info("Exception CandidateLogin CandidateDAO+DAO", oEx);

                //new CLogger("Exception CandidateLogin CandidateDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Exception CandidateLogin CandidateDAO+DAO", ELogLevel.Debug, oEx);
            }
            finally
            {
                if (oSqlDataReader!=null && !oSqlDataReader.IsClosed)
                {
                    oSqlDataReader.Close();
                }
            }

            //new CLogger("Out CandidateLogin CandidateDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Out CandidateLogin CandidateDAO+DAO", ELogLevel.Debug); ;

            logger.Info("End CandidateLogin CandidateDAO+DAO");

            return oResult;
        }