/// <summary>
        /// This method Deletes a category if the category is not used for any question
        /// </summary>
        /// <param name="oListCategory"> It takes List<Category> Object </param>
        /// <param name="iArrCheck"> It is an integer array to indicate the marked categories</param>
        /// <returns> It returns Result Object </returns>
        public Result CategoryDelete(List<Category> oListCategory, int[] iArrCheck)
        {
            //new CLogger("Start CategoryDelete CategoryDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start CategoryDelete CategoryDAO+DAO", ELogLevel.Debug);

            logger.Info("Start CategoryDelete CategoryDAO+DAO");

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

            String sDelete = String.Empty;

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

            int i = 0;

            try
            {
                for (i = 0; i < iArrCheck.Length; i++)
                {
                    if (iArrCheck[i] == 1)
                    {
                        sDelete = "delete from EX_Category where CategoryID='" + oListCategory[i].CategoryID + "' and CategoryID not in (select QuestionCategoryID from EX_Question where QuestionCategoryID='" + oListCategory[i].CategoryID + "')";

                        oListString.Add(sDelete);
                    }
                }

                if (oDAOUtil.ExecuteNonQuery(oListString))
                {
                    oResult.ResultObject = oListCategory; // This is not necessary Object
                    oResult.ResultMessage = "Category Delete Success(If not deleted then,it is used)...";
                    oResult.ResultIsSuccess = true;
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Category Delete Fail...";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Category Delete Exception...";

                logger.Info("Exception CategoryDelete CategoryDAO+DAO", oEx);

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

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

            logger.Info("End CategoryDelete CategoryDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This Methods provides to get current time from database
        /// </summary>
        /// <param name="sFormatNumber"> It takes format string to convert the sqlserver datetime </param>
        /// <returns> return result</returns>
        public Result GetCurrentTime(String sFormatNumber)
        {
            logger.Info("start GetCurrentTime Utility+GetCurrentTimeFromDataBase");

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

            String sSelect = String.Empty;

            Object oObject = null;

            try
            {
                if (!sFormatNumber.Equals(String.Empty))
                {
                    sSelect = "select convert(varchar, getdate(), " + sFormatNumber + ") as currentTime";

                    oObject=oDAOUtil.GetExecuteScalar(sSelect);

                    if (oObject != null)
                    {
                        oResult.ResultObject = oObject;
                        oResult.ResultMessage = "Get time from DataBase success...";
                        oResult.ResultIsSuccess = true;
                    }
                    else
                    {
                        oResult.ResultIsSuccess = false;
                        oResult.ResultMessage = "Get time from DataBase failed...";
                    }
                }
                else
                {
                    sSelect = "select getdate() as currentTime";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultMessage = "Exception at geting time from DataBase...";
                oResult.ResultException = oEx;

                logger.Info("Esception GetCurrentTime Utility+GetCurrentTimeFromDataBase",oEx);
            }

            logger.Info("End GetCurrentTime Utility+GetCurrentTimeFromDataBase");

            return oResult;
        }
        /// <summary>
        /// This method change the systemuser password
        /// </summary>
        /// <param name="oSystemUser"> It takes SystemUser Object </param>
        /// <param name="sNewPassword"> It takes String Object</param>
        /// <param name="sConfirmPassword"> It takes String Object</param>
        /// <returns> It returns Result Object </returns>
        public Result ChangePassword(SystemUser oSystemUser, String sNewPassword, String sConfirmPassword)
        {
            logger.Info("Start ChangePassword SystemUserDAO+DAO");

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

            String sUpadte = String.Empty;

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

            try
            {
                sUpadte = "update EX_SystemUser set SystemUserPassword='******' where SystemUserID='" + oSystemUser.SystemUserID + "' and SystemUserPassword='******' and DeleteTime is NULL";

                oListString.Add(sUpadte);

                if (oDAOUtil.ExecuteNonQuery(oListString))
                {
                    oSystemUser.SystemUserPassword = sNewPassword;

                    oResult.ResultObject = oSystemUser;
                    oResult.ResultMessage = "Your password have been changed successfully...";
                    oResult.ResultIsSuccess = true;
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "SystemUser ChangePassword Fail...";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "SystemUser ChangePassword Exception...";

                logger.Info("Exception ChangePassword SystemUserDAO+DAO", oEx);
            }

            logger.Info("End ChangePassword SystemUserDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This method get total possible time for answering questions which are set up for an exam
        /// </summary>
        /// <param name="oExam"> It takes Exam Object </param>
        /// <returns> It returns Result Object </returns>
        public Result GetTotalLastSetupQuestionTime(Exam oExam)
        {
            logger.Info("Start GetTotalLastSetupQuestionTime QuestionDAO+DAO");

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

            String sSelect = String.Empty;

            Object oObject = new Object();

            float fTotalTime = 0f;

            try
            {
                sSelect = "select sum(EX_Question.QuestionPossibleAnswerTime) from EX_Question inner join EX_QuestionGeneration on EX_Question.QuestionID = EX_QuestionGeneration.QuestionID where EX_QuestionGeneration.ExamID='" + oExam.ExamID + "'";

                oObject = oDAOUtil.GetExecuteScalar(sSelect);

                if (oObject.ToString().Length > 0)
                {
                    fTotalTime = float.Parse(oObject.ToString());
                }

                oResult.ResultObject = fTotalTime;
                oResult.ResultMessage = "GetTotalLastSetupQuestionTime Success...";
                oResult.ResultIsSuccess = true;
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Exception occured during GetTotalLastSetupQuestionTime...";

                logger.Info("Exception GetTotalLastSetupQuestionTime QuestionDAO+DAO", oEx);
            }

            logger.Info("End GetTotalLastSetupQuestionTime QuestionDAO+DAO");

            return oResult;
        }
        public Result LoadAllQuestionsOfAnExam(Exam oSelectedExam)
        {
            logger.Info("Start LoadAllQuestionsOfAnExam QuestionDAO+DAO");

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

            SqlDataReader oSqlDataReader = null;

            String sSelect = String.Empty;

            List<QuestionSetup> oListQuestionSetup = new List<QuestionSetup>();

            try
            {
                sSelect="select distinct EX_QuestionGeneration.ExamID,"
                +" EX_QuestionGeneration.SetupQuestionMark,"
                +" EX_QuestionGeneration.GeneratorID,"
                +" EX_Question.QuestionID,"
                +" EX_Question.QuestionText,EX_Question.QuestionTypeID,"
                +" EX_Question.QuestionPossibleAnswerTime,"
                +" EX_Label.LabelID,"
                +" EX_Label.LabelName,"
                +" EX_Category.CategoryID,EX_Category.CategoryName"
                +" from EX_QuestionGeneration,EX_Question,EX_Category,EX_Label"
                +" where EX_Question.QuestionLabelID=EX_Label.LabelID"
                +" and EX_Question.QuestionCategoryID=EX_Category.CategoryID"
                +" and EX_Question.QuestionID=EX_QuestionGeneration.QuestionID"
                +" and EX_QuestionGeneration.ExamID='" + oSelectedExam.ExamID + "'"
                +" order by EX_Category.CategoryName,EX_Label.LabelName,EX_Question.QuestionTypeID asc";

                oSqlDataReader = oDAOUtil.GetReader(sSelect);

                while (oSqlDataReader.Read())
                {
                    QuestionSetup oPopulatedQuestionSetup = new QuestionSetup();

                    oPopulatedQuestionSetup.QuestionSetupExam.ExamID = new Guid(oSqlDataReader["ExamID"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupMark = float.Parse(oSqlDataReader["SetupQuestionMark"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupSystemUser.SystemUserID = new Guid(oSqlDataReader["GeneratorID"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionID = new Guid(oSqlDataReader["QuestionID"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionText = oSqlDataReader["QuestionText"].ToString();
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionQuestionType.QuestionTypeID = int.Parse(oSqlDataReader["QuestionTypeID"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionPossibleAnswerTime = float.Parse(oSqlDataReader["QuestionPossibleAnswerTime"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionLevel.LevelID = new Guid(oSqlDataReader["LabelID"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionLevel.LevelName = oSqlDataReader["LabelName"].ToString();
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionCategory.CategoryID = int.Parse(oSqlDataReader["CategoryID"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionCategory.CategoryName = oSqlDataReader["CategoryName"].ToString();

                    oListQuestionSetup.Add(oPopulatedQuestionSetup);
                }

                oSqlDataReader.Close();

                foreach (QuestionSetup oQuestionSetupInList in oListQuestionSetup)
                {
                    if (oQuestionSetupInList.QuestionSetupQuestion.QuestionQuestionType.QuestionTypeID == 0)
                    {
                        sSelect = "select EX_Objective.ObjectiveQuestionID,EX_Objective.ObjectiveAnswer,"
                        +" EX_Objective.ObjectiveAnswerIsValid from EX_Objective"
                        + " where EX_Objective.ObjectiveQuestionID = '" + oQuestionSetupInList.QuestionSetupQuestion.QuestionID + "'";

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

                        oSqlDataReader = oDAOUtil.GetReader(sSelect);

                        while (oSqlDataReader.Read())
                        {
                            Choice oChoice = new Choice();

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

                            oListChoice.Add(oChoice);
                        }

                        oSqlDataReader.Close();

                        oQuestionSetupInList.QuestionSetupQuestion.QuestionObjectiveType.ListOfChoices = oListChoice;
                    }

                }

                oResult.ResultObject = oListQuestionSetup;
                oResult.ResultMessage = "LoadAllQuestionsOfAnExam success...";
                oResult.ResultIsSuccess = true;

            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultMessage = "Exception occured during LoadAllQuestionsOfAnExam...";
                oResult.ResultException = oEx;

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

            logger.Info("End LoadAllQuestionsOfAnExam QuestionDAO+DAO");

            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 DescriptiveAnswer Marks For Candidates For A SystemUser Of An Exam
        /// </summary>
        /// <param name="sCandidateID"> It takes String Object </param>
        /// <param name="oListCandidateAnswerQuestion"> It takes List<CandidateAnswerQuestion> Object </param>
        /// <param name="oExam"> It takes Exam Object </param>
        /// <param name="oSystemUser"> It takes SystemUser Object </param>
        /// <returns> It returns Result Object </returns>
        public Result SaveDescriptiveAnswerMarksForCandidatesForASystemUserOfAnExam(String sCandidateID, List<CandidateAnswerQuestion> oListCandidateAnswerQuestion, Exam oExam, SystemUser oSystemUser)
        {
            //new CLogger("Start SaveDescriptiveAnswerMarksForCandidatesForASystemUserOfAnExam EvaluateProcessDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start SaveDescriptiveAnswerMarksForCandidatesForASystemUserOfAnExam EvaluateProcessDAO+DAO", ELogLevel.Debug);

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

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

            String sUpdate = String.Empty;

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

            try
            {
                foreach (CandidateAnswerQuestion oCandidateAnswerQuestionInList in oListCandidateAnswerQuestion)
                {
                    if (oCandidateAnswerQuestionInList.QuestionForCandidateAnswer.QuestionQuestionType.QuestionTypeID == 1)
                    {
                        sUpdate = "update EX_CandidateExam set ObtainMark='" + oCandidateAnswerQuestionInList.ObtainMark + "' where ExamID='" + oExam.ExamID + "' and CandidateID='" + sCandidateID + "' and QuestionID='" + oCandidateAnswerQuestionInList.QuestionForCandidateAnswer.QuestionID + "'";

                        oListString.Add(sUpdate);
                    }
                }

                if (oDAOUtil.ExecuteNonQuery(oListString))
                {
                    oResult.ResultObject = oListCandidateAnswerQuestion;
                    oResult.ResultMessage = "Descriptive answers are evaluated...";
                    oResult.ResultIsSuccess = true;
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Descriptive answers are evaluation failed...";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "SaveDescriptiveAnswerMarksForCandidatesForASystemUserOfAnExam Exception...";

                logger.Info("Exception SaveDescriptiveAnswerMarksForCandidatesForASystemUserOfAnExam EvaluateProcessDAO+DAO", oEx);
                //new CLogger("Exception SaveDescriptiveAnswerMarksForCandidatesForASystemUserOfAnExam EvaluateProcessDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Exception SaveDescriptiveAnswerMarksForCandidatesForASystemUserOfAnExam EvaluateProcessDAO+DAO", ELogLevel.Debug, oEx);
            }

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

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

            return oResult;
        }
        /// <summary>
        /// This method Load all levels
        /// </summary>
        /// <returns> It returns Result Object </returns>
        public Result LoadAllLevels()
        {
            logger.Info("Start LoadAllLevels LevelDAO+DAO");

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

            SqlDataReader oSqlDataReader = null;

            String sSelect = String.Empty;

            List<Level> oListLevel = new List<Level>();

            try
            {
                sSelect = "select EX_Label.LabelID,EX_Label.LabelName,EX_Label.LabelPrerequisite from"
                +" EX_Label order by EX_Label.LabelName";

                oSqlDataReader = oDAOUtil.GetReader(sSelect);

                while (oSqlDataReader.Read())
                {
                    Level oLevel = new Level();

                    oLevel.LevelID = new Guid(oSqlDataReader["LabelID"].ToString());
                    oLevel.LevelName = oSqlDataReader["LabelName"].ToString();
                    oLevel.LevelDescription = oSqlDataReader["LabelPrerequisite"].ToString();

                    oListLevel.Add(oLevel);
                }

                oSqlDataReader.Close();

                oResult.ResultObject = oListLevel;
                oResult.ResultMessage = "Load All Levels Success...";
                oResult.ResultIsSuccess = true;
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Load All Levels Exception...";

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

            logger.Info("End LoadAllLevels LevelDAO+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 show the questions according to category,type,questionlevel.
        /// And these questions are shown to setup them for an exam
        /// </summary>
        /// <param name="oQuestion"> It takes Question Object </param>
        /// <param name="oExam"> It takes Exam Object </param>
        /// <returns> It returns Result Object </returns>
        public Result QuestionListShowForSetupByQuestionLevel(Question oQuestion, Exam oExam)
        {
            logger.Info("Start QuestionListShowForSetupByQuestionLevel QuestionDAO+DAO");

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

            SqlDataReader oSqlDataReader = null;

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

            List<QuestionSetup> oListQuestionSetup = new List<QuestionSetup>();

            try
            {
                //sSelect = "select distinct QuestionID,QuestionText,QuestionCreatorID,QuestionDefaultMark,QuestionCategoryID,"
                //    + " QuestionTypeID,QuestionPossibleAnswerTime,QuestionLabelID,EX_Label.LabelName,EX_Label.LabelPrerequisite"
                //    + " from EX_Question left join EX_Label on EX_Question.QuestionLabelID=EX_Label.LabelID where QuestionCategoryID='" + oQuestion.QuestionCategory.CategoryID +
                //    "' and QuestionTypeID='" + oQuestion.QuestionQuestionType.QuestionTypeID + "'";

                if (oQuestion.QuestionCreator.SystemUserName.ToLower().Equals("administrator"))
                {
                    //sSelect = "select distinct EX_Question.QuestionID as EntryQuestionID,EX_QuestionGeneration.QuestionID as GeneratedQuestionID,EX_QuestionGeneration.SetupQuestionMark,QuestionText,QuestionCreatorID,QuestionDefaultMark,QuestionCategoryID,QuestionTypeID,EX_Question.QuestionPossibleAnswerTime from EX_Question left join EX_QuestionGeneration on EX_Question.QuestionID=EX_QuestionGeneration.QuestionID where EX_Question.QuestionCategoryID='" + oQuestion.QuestionCategory.CategoryID + "' and EX_Question.QuestionTypeID='" + oQuestion.QuestionQuestionType.QuestionTypeID + "'";

                    //sSelect = "select distinct QuestionID,QuestionText,QuestionCreatorID,QuestionDefaultMark,QuestionCategoryID," +
                    //"QuestionTypeID,QuestionPossibleAnswerTime,QuestionLabelID from EX_Question where QuestionCategoryID='" + oQuestion.QuestionCategory.CategoryID +
                    //"' and QuestionTypeID='" + oQuestion.QuestionQuestionType.QuestionTypeID + "' and QuestionLabelID='"+oQuestion.QuestionLevel.LevelID+"'";

                    sSelect = "select distinct QuestionID,QuestionText,QuestionCreatorID,QuestionDefaultMark,QuestionCategoryID,"
                        + " QuestionTypeID,QuestionPossibleAnswerTime,QuestionLabelID,EX_Label.LabelName,EX_Label.LabelPrerequisite"
                        + " from EX_Question inner join EX_Label on EX_Question.QuestionLabelID=EX_Label.LabelID where QuestionCategoryID='" + oQuestion.QuestionCategory.CategoryID +
                        "' and QuestionTypeID='" + oQuestion.QuestionQuestionType.QuestionTypeID + "' and QuestionLabelID='" + oQuestion.QuestionLevel.LevelID + "'";
                }
                else
                {
                    //sSelect = "select distinct EX_Question.QuestionID as EntryQuestionID,EX_QuestionGeneration.QuestionID as GeneratedQuestionID,EX_QuestionGeneration.SetupQuestionMark,QuestionText,QuestionCreatorID,QuestionDefaultMark,QuestionCategoryID,QuestionTypeID,EX_Question.QuestionPossibleAnswerTime from EX_Question left join EX_QuestionGeneration on EX_Question.QuestionID=EX_QuestionGeneration.QuestionID where EX_Question.QuestionCreatorID='" + oQuestion.QuestionCreator.SystemUserID + "' and EX_Question.QuestionCategoryID='" + oQuestion.QuestionCategory.CategoryID + "' and EX_Question.QuestionTypeID='" + oQuestion.QuestionQuestionType.QuestionTypeID + "'";

                    //sSelect = "select distinct QuestionID,QuestionText,QuestionCreatorID,QuestionDefaultMark,QuestionCategoryID," +
                    //"QuestionTypeID,QuestionPossibleAnswerTime,QuestionLabelID from EX_Question where QuestionCategoryID='" + oQuestion.QuestionCategory.CategoryID +
                    //"' and QuestionTypeID='" + oQuestion.QuestionQuestionType.QuestionTypeID + "' and QuestionLabelID='" + oQuestion.QuestionLevel.LevelID + "'";

                    sSelect = "select distinct QuestionID,QuestionText,QuestionCreatorID,QuestionDefaultMark,QuestionCategoryID,"
                        + " QuestionTypeID,QuestionPossibleAnswerTime,QuestionLabelID,EX_Label.LabelName,EX_Label.LabelPrerequisite"
                        + " from EX_Question inner join EX_Label on EX_Question.QuestionLabelID=EX_Label.LabelID where QuestionCategoryID='" + oQuestion.QuestionCategory.CategoryID +
                        "' and QuestionTypeID='" + oQuestion.QuestionQuestionType.QuestionTypeID + "' and QuestionLabelID='" + oQuestion.QuestionLevel.LevelID + "'";
                }

                oSqlDataReader = oDAOUtil.GetReader(sSelect);

                while (oSqlDataReader.Read())
                {
                    QuestionSetup oPopulatedQuestionSetup = new QuestionSetup();

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

                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionLevel.LevelID = new Guid(oSqlDataReader["QuestionLabelID"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionLevel.LevelName = oSqlDataReader["LabelName"].ToString();
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionLevel.LevelDescription = oSqlDataReader["LabelPrerequisite"].ToString();

                    oPopulatedQuestionSetup.QuestionSetupMark = oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionDefaultMark;
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionIsUsed = false;

                    //if (oSqlDataReader["GeneratedQuestionID"].ToString().Length > 0)
                    //{
                    //    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionIsUsed = true;
                    //}

                    //if (oSqlDataReader["SetupQuestionMark"].ToString().Length > 0)
                    //{
                    //    oPopulatedQuestionSetup.QuestionSetupMark = float.Parse(oSqlDataReader["SetupQuestionMark"].ToString());
                    //}

                    oListQuestionSetup.Add(oPopulatedQuestionSetup);
                }

                oSqlDataReader.Close();

                if (oQuestion.QuestionQuestionType.QuestionTypeID == 0) //enum should be used here
                {
                    foreach (QuestionSetup oQuestionSetupInList in oListQuestionSetup)
                    {
                        sChoiceSelect = "select ObjectiveAnswer,ObjectiveAnswerIsValid from EX_Objective where ObjectiveQuestionID='" + oQuestionSetupInList.QuestionSetupQuestion.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());

                            oListChoice.Add(oChoice);
                        }

                        oSqlDataReader.Close();

                        oQuestionSetupInList.QuestionSetupQuestion.QuestionObjectiveType.ListOfChoices = oListChoice;
                    }
                }

                foreach (QuestionSetup oQuestionSetupInList in oListQuestionSetup)
                {
                    sSelect = "select distinct EX_QuestionGeneration.QuestionID as GeneratedQuestionID,EX_QuestionGeneration.SetupQuestionMark from EX_QuestionGeneration where EX_QuestionGeneration.QuestionID='" + oQuestionSetupInList.QuestionSetupQuestion.QuestionID + "' and EX_QuestionGeneration.ExamID='" + oExam.ExamID + "'";

                    oSqlDataReader = oDAOUtil.GetReader(sSelect);

                    if (oSqlDataReader.HasRows)
                    {
                        oQuestionSetupInList.QuestionSetupQuestion.QuestionIsUsed = true;

                        while (oSqlDataReader.Read())
                        {
                            if (oSqlDataReader["SetupQuestionMark"].ToString().Length > 0)
                            {
                                oQuestionSetupInList.QuestionSetupMark = float.Parse(oSqlDataReader["SetupQuestionMark"].ToString());
                            }
                        }
                    }

                    oSqlDataReader.Close();
                }

                oResult.ResultObject = oListQuestionSetup;
                oResult.ResultMessage = "QuestionListShowForSetupByQuestionLevel Success...";
                oResult.ResultIsSuccess = true;
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultMessage = "Exception occured during QuestionListShowForSetupByQuestionLevel...";
                oResult.ResultException = oEx;

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

            logger.Info("End QuestionListShowForSetupByQuestionLevel QuestionDAO+DAO");

            return oResult;
        }
        //r
        /// <summary>
        /// This method loads the categories to set them in session
        /// </summary>
        /// <returns> It returns Result Object </returns>
        public Result CategoryGetFromDatabaseForSetSession()
        {
            //new CLogger("Start CategoryGetFromDatabaseForSetSession CategoryDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start CategoryGetFromDatabaseForSetSession CategoryDAO+DAO", ELogLevel.Debug);

            logger.Info("Start CategoryGetFromDatabaseForSetSession CategoryDAO+DAO");

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

            String sSelectCategory = String.Empty;
            String sCategoryName = String.Empty;

            SqlDataReader oSqlDataReader = null;

            List<Category> oListCategory = new List<Category>();

            int iCategoryID = 0;

            sSelectCategory = "select CategoryID,CategoryName from EX_Category";

            try
            {
                oSqlDataReader = oDAOUtil.GetReader(sSelectCategory);

                while (oSqlDataReader.Read())
                {
                    Category oCategory = new Category();

                    iCategoryID = int.Parse(oSqlDataReader["CategoryID"].ToString());
                    sCategoryName = oSqlDataReader["CategoryName"].ToString();

                    oCategory.CategoryID = iCategoryID;
                    oCategory.CategoryName = sCategoryName;

                    oListCategory.Add(oCategory);
                }

                oSqlDataReader.Close();

                oResult.ResultObject = oListCategory;
                oResult.ResultMessage = "Category Get success...";
                oResult.ResultIsSuccess = true;
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Exception occured during Category Get...";

                logger.Info("Exception CategoryGetFromDatabaseForSetSession CategoryDAO+DAO", oEx);

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

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

            logger.Info("End CategoryGetFromDatabaseForSetSession CategoryDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This method checks the systemuser login
        /// </summary>
        /// <param name="oSystemUser"> It takes SystemUser Object </param>
        /// <returns> It returns Result Object </returns>
        public Result SystemUserLogin(SystemUser oSystemUser)
        {
            logger.Info("Start SystemUserLogin SystemUserDAO+DAO");

            Result oResult = new Result();
            SqlDataReader oSqlDataReader = null;

            try
            {
                DAOUtil oDAOUtil = new DAOUtil();
                SystemUser oPopulatedSystemUser = new SystemUser();

                Boolean flag = false;

                String sSelect = "select SystemUserID,SystemUserName,SystemUserPassword,EmailAddress from EX_SystemUser where SystemUserName='******' and SystemUserPassword='******' and DeleteTime is NULL";
                oSqlDataReader = oDAOUtil.GetReader(sSelect);

                if (oSqlDataReader.HasRows)
                {
                    while (oSqlDataReader.Read())
                    {
                        oPopulatedSystemUser.SystemUserID = new Guid(oSqlDataReader["SystemUserID"].ToString());
                        oPopulatedSystemUser.SystemUserName = oSqlDataReader["SystemUserName"].ToString();
                        oPopulatedSystemUser.SystemUserPassword = oSqlDataReader["SystemUserPassword"].ToString();
                        oPopulatedSystemUser.SystemUserEmail = oSqlDataReader["EmailAddress"].ToString();

                        flag = true;
                    }

                    oSqlDataReader.Close();

                    if (flag)
                    {
                        oResult.ResultObject = oPopulatedSystemUser;
                        oResult.ResultMessage = "Login Success...";
                        oResult.ResultIsSuccess = true;
                    }
                    else
                    {
                        oResult.ResultIsSuccess = false;
                        oResult.ResultMessage = "System User Login Fail...";
                    }
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "System User Not Found...";
                }

            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultMessage = "SystemUserLogin Exception...";
                oResult.ResultException = oEx;

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

            logger.Info("End SystemUserLogin SystemUserDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This method update the systemuser
        /// It updates systemuser name, if the name is not duplicated
        /// </summary>
        /// <param name="oListSystemUser"> It takes List<SystemUser> Object </param>
        /// <param name="iArrCheck"> It takes integer array which indicates the marked system user</param>
        /// <returns> It returns Result Object </returns>
        public Result UpdateSystemUser(List<SystemUser> oListSystemUser, int[] iArrCheck)
        {
            logger.Info("Start UpdateSystemUser SystemUserDAO+DAO");

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

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

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

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

            //String sUpdate = String.Empty;

            int i = 0;

            try
            {
                for (i = 0; i < iArrCheck.Length; i++)
                {
                    if (iArrCheck[i] == 1)
                    {
                        //sUpdate = "if not exists(select SystemUserName from EX_SystemUser where SystemUserName='******') update EX_SystemUser set SystemUserName='******',SystemUserPassword='******',EmailAddress='" + oListSystemUser[i].SystemUserEmail + "' where SystemUserID='" + oListSystemUser[i].SystemUserID + "' and DeleteTime is NULL";

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

                        oSqlCommand.Parameters.Add("@SystemUserID", SqlDbType.UniqueIdentifier);
                        oSqlCommand.Parameters["@SystemUserID"].Value = oListSystemUser[i].SystemUserID;

                        oSqlCommand.Parameters.Add("@SystemUserName", SqlDbType.VarChar);
                        oSqlCommand.Parameters["@SystemUserName"].Value = oListSystemUser[i].SystemUserName;

                        oSqlCommand.Parameters.Add("@SystemUserPassword", SqlDbType.VarChar);
                        oSqlCommand.Parameters["@SystemUserPassword"].Value = oListSystemUser[i].SystemUserPassword;

                        oSqlCommand.Parameters.Add("@EmailAddress", SqlDbType.VarChar);
                        oSqlCommand.Parameters["@EmailAddress"].Value = oListSystemUser[i].SystemUserEmail;

                        oListSqlCommand.Add(oSqlCommand);

                        //sUpdate = "update EX_SystemUser set"
                        //        + " SystemUserName="******" ( case when not exists(select SystemUserName from EX_SystemUser where SystemUserName='******')"
                        //        + " then  '" + oListSystemUser[i].SystemUserName + "' else '" + oListSystemUser[i].SystemUserName + "' end )"
                        //        + " ,SystemUserPassword='******'"
                        //        + ",EmailAddress= ( case  when not exists(select EmailAddress from EX_SystemUser where EmailAddress='" + oListSystemUser[i].SystemUserEmail + "')"
                        //        + " then '" + oListSystemUser[i].SystemUserEmail + "' else '" + oListSystemUser[i].SystemUserEmail + "' end )"
                        //        + " where SystemUserID='" + oListSystemUser[i].SystemUserID + "' and DeleteTime is NULL";

                        //oListString.Add(sUpdate);

                    }
                }

                oListInt = oDAOUtil.ExecuteNonQueryForStoredProcedure(oListSqlCommand);

                if (oListInt.Count > 0)
                {
                    oResult.ResultObject = oListSystemUser;
                    oResult.ResultMessage = "SystemUser Update Success(if email or name not update, then it is duplicate)...";
                    oResult.ResultIsSuccess = true;
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "SystemUser Update Failed...";
                }

                //if (oDAOUtil.ExecuteNonQuery(oListString))
                //{
                //    oResult.ResultObject = oListSystemUser;
                //    oResult.ResultMessage = "SystemUser Update Success(if email or name not update, then it is duplicate)...";
                //    oResult.ResultIsSuccess = true;
                //}
                //else
                //{
                //    oResult.ResultIsSuccess = false;
                //    oResult.ResultMessage = "SystemUser Update Fail...";
                //}
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "SystemUser Update Exception...";

                logger.Info("Exception UpdateSystemUser SystemUserDAO+DAO", oEx);
            }

            logger.Info("End UpdateSystemUser SystemUserDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This method inserts systemuser, if that systemuser name is not existed
        /// </summary>
        /// <param name="oSystemUser"> It takes SystemUser Object </param>
        /// <returns> It returns Result Object </returns>
        public Result SystemUserEntry(SystemUser oSystemUser)
        {
            logger.Info("Start SystemUserEntry SystemUserDAO+DAO");

            Result oResult = new Result();

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

            try
            {
                DAOUtil oDAOUtil = new DAOUtil();

                //Boolean flag = true;

                //String sSelect = "select SystemUserName from EX_SystemUser where (SystemUserName='******' or EmailAddress='" + oSystemUser.SystemUserEmail + "') and DeleteTime is NULL";
                //String sInsert = String.Empty;
                //List<String> oListOfString = new List<String>();

                //oSqlDataReader = oDAOUtil.GetReader(sSelect);

                //if (oSqlDataReader.HasRows)
                //{
                //    flag = false;
                //}

                //oSqlDataReader.Close();

                //if (flag)
                //{
                //    oSystemUser.SystemUserID = Guid.NewGuid();

                //    sInsert = "if not exists(select SystemUserName from EX_SystemUser where (SystemUserName='******' or EmailAddress='" + oSystemUser.SystemUserEmail + "')"
                //    +" and DeleteTime is NULL)"
                //    +" insert into EX_SystemUser(SystemUserID,SystemUserName,SystemUserPassword,EmailAddress)"
                //    +" values('" + oSystemUser.SystemUserID + "','" + oSystemUser.SystemUserName + "','" + oSystemUser.SystemUserPassword + "','" + oSystemUser.SystemUserEmail + "')";
                //    oListOfString.Add(sInsert);

                //    if (oDAOUtil.ExecuteNonQuery(oListOfString))
                //    {
                //        oResult.ResultObject = oSystemUser;
                //        oResult.ResultMessage = "System User Entry Success...";
                //        oResult.ResultIsSuccess = true;
                //    }
                //    else
                //    {
                //        oResult.ResultIsSuccess = false;
                //        oResult.ResultMessage = "System User Entry Failed...";
                //    }
                //}
                //else
                //{
                //    oResult.ResultIsSuccess = false;
                //    oResult.ResultMessage = "System User is already Existed...";
                //}

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

                oSystemUser.SystemUserID = Guid.NewGuid();

                oSqlCommand.Parameters.Add("@SystemUserID", SqlDbType.UniqueIdentifier);
                oSqlCommand.Parameters["@SystemUserID"].Value = oSystemUser.SystemUserID;

                oSqlCommand.Parameters.Add("@SystemUserName", SqlDbType.VarChar);
                oSqlCommand.Parameters["@SystemUserName"].Value = oSystemUser.SystemUserName;

                oSqlCommand.Parameters.Add("@SystemUserPassword", SqlDbType.VarChar);
                oSqlCommand.Parameters["@SystemUserPassword"].Value = oSystemUser.SystemUserPassword;

                oSqlCommand.Parameters.Add("@EmailAddress", SqlDbType.VarChar);
                oSqlCommand.Parameters["@EmailAddress"].Value = oSystemUser.SystemUserEmail;

                oListSqlCommand.Add(oSqlCommand);

                oListInt = oDAOUtil.ExecuteNonQueryForStoredProcedure(oListSqlCommand);

                if (oListInt.Count > 0)
                {
                    if (oListInt[0] > 0)
                    {
                        oResult.ResultObject = oSystemUser;
                        oResult.ResultMessage = "System User Entry Success...";
                        oResult.ResultIsSuccess = true;
                    }
                    else
                    {
                        oResult.ResultIsSuccess = false;
                        oResult.ResultMessage = "System User Name or Email is already Existed...";
                    }
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "SystemUser Entry Failed...";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "System User Entry Exception...";

                logger.Info("Exception SystemUserEntry SystemUserDAO+DAO", oEx);
            }

            logger.Info("End SystemUserEntry SystemUserDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This method update the systemuser delete time, indicating that, the systemuser is deleted.
        /// </summary>
        /// <param name="oListSystemUser"> It takes List<SystemUser> Object </param>
        /// <param name="iArrCheck"> It takes integer array which indicates the marked system user</param>
        /// <returns> It returns Result Object </returns>
        public Result SystemUserDelete(List<SystemUser> oListSystemUser, int[] iArrCheck)
        {
            logger.Info("Start SystemUserDelete SystemUserDAO+DAO");

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

            List<SystemUser> oListSystemUser1 = new List<SystemUser>();

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

            String sUpdate = String.Empty;

            int i = 0;

            try
            {
                for (i = 0; i < iArrCheck.Length; i++)
                {
                    if (iArrCheck[i] == 1)
                    {
                        sUpdate = "update EX_SystemUser set DeleteTime='" + DateTime.Now + "' where SystemUserID='" + oListSystemUser[i].SystemUserID + "'";
                        oListString.Add(sUpdate);
                        oListSystemUser1.Add(null);
                    }
                    else
                    {
                        oListSystemUser1.Add(oListSystemUser[i]);
                    }
                }

                oListSystemUser1.RemoveAll(delegate(SystemUser oSystemUser) { if (oSystemUser != null) { return false; } return true; });

                if (oDAOUtil.ExecuteNonQuery(oListString))
                {
                    oResult.ResultObject = oListSystemUser1;
                    oResult.ResultMessage = "System User Delete Success...";
                    oResult.ResultIsSuccess = true;
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "System User Delete Failed...";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Exception occured during System User Delete...";

                logger.Info("Exception SystemUserDelete SystemUserDAO+DAO", oEx);
            }

            logger.Info("End SystemUserDelete SystemUserDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This method Save ObjectiveAnswer Marks For All Candidate Of An Exam
        /// </summary>
        /// <param name="oListCandidateForExamForGrid"> It takes List<CandidateForExam> Object </param>
        /// <param name="oExam"> It takes Exam Object </param>
        /// <param name="oSystemUser"> It takes SystemUser Object </param>
        /// <returns> It returns Result Object </returns>
        public Result SaveObjectiveAnswerMarksForAllCandidateOfAnExam(List<CandidateForExam> oListCandidateForExamForEvaluate, SystemUser oSystemUser, Exam oExam)
        {
            //new CLogger("Start SaveObjectiveAnswerMarksForAllCandidateOfAnExam EvaluateProcessDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start SaveObjectiveAnswerMarksForAllCandidateOfAnExam EvaluateProcessDAO+DAO", ELogLevel.Debug);

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

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

            String sUpdate = String.Empty;

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

            try
            {
                foreach (CandidateForExam oCandidateForExamInList in oListCandidateForExamForEvaluate)
                {
                    foreach (CandidateAnswerQuestion oCandidateAnswerQuestionInList in oCandidateForExamInList.CadidateCandidateExam.CandidateAnsweredQuestions)
                    {
                        if (oCandidateAnswerQuestionInList.QuestionForCandidateAnswer.QuestionQuestionType.QuestionTypeID == 0)
                        {
                            sUpdate = "update EX_CandidateExam set ObtainMark='" + oCandidateAnswerQuestionInList.ObtainMark + "' where ExamID='" + oExam.ExamID + "' and CandidateID='" + oCandidateForExamInList.CandidateForExamCandidate.CandidateCompositeID + "' and QuestionID='" + oCandidateAnswerQuestionInList.QuestionForCandidateAnswer.QuestionID + "'";

                            oListString.Add(sUpdate);
                        }
                    }
                }

                if (oDAOUtil.ExecuteNonQuery(oListString))
                {
                    oResult.ResultObject = oListCandidateForExamForEvaluate;
                    oResult.ResultMessage = "Objective answers are saved for all candidate of this exam...";
                    oResult.ResultIsSuccess = true;
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Saving objective answers for all candidate of this exam Failed...";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Exception at saving objective answers for all candidate of this exam...";

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

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

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

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

            return oResult;
        }
        //r
        /// <summary>
        /// This method inserts a Question
        /// </summary>
        /// <param name="oQuestion"> It takes Question Object </param>
        /// <returns> It returns Result Object </returns>
        public Result QuestionEntry(Question oQuestion)
        {
            logger.Info("Start QuestionEntry QuestionDAO+DAO");

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

            String sInsert = String.Empty;
            List<String> oListInsert = new List<String>();

            int i=0;
            int iBit = 0;

            try
            {
                oQuestion.QuestionID = Guid.NewGuid();

                sInsert = "insert into EX_Question(QuestionID,QuestionText,QuestionCreatorID,QuestionDefaultMark,QuestionCategoryID,QuestionTypeID,QuestionPossibleAnswerTime,QuestionLabelID) values('" + oQuestion.QuestionID + "','" + oQuestion.QuestionText + "','" + oQuestion.QuestionCreator.SystemUserID + "','" + oQuestion.QuestionDefaultMark + "','" + oQuestion.QuestionCategory.CategoryID + "','" + oQuestion.QuestionQuestionType.QuestionTypeID + "','" + oQuestion.QuestionPossibleAnswerTime+"','"+oQuestion.QuestionLevel.LevelID + "')";
                oListInsert.Add(sInsert);

                if (oQuestion.QuestionQuestionType.QuestionTypeID == 0)
                {
                    for (i = 0; i < oQuestion.QuestionObjectiveType.ListOfChoices.Count; i++)
                    {
                        iBit = 0;

                        if (oQuestion.QuestionObjectiveType.ListOfChoices[i].ChoiceIsValid)
                        {
                            iBit = 1;
                        }

                        sInsert = "insert into EX_Objective(ObjectiveQuestionID,ObjectiveAnswer,ObjectiveAnswerIsValid) values('" + oQuestion.QuestionID + "','" + oQuestion.QuestionObjectiveType.ListOfChoices[i].ChoiceName + "','" + iBit + "')";
                        oListInsert.Add(sInsert);
                    }
                }

                if (oDAOUtil.ExecuteNonQuery(oListInsert))
                {
                    oResult.ResultObject = oQuestion;
                    oResult.ResultMessage = "Question Entry Success...";
                    oResult.ResultIsSuccess = true;
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Question Entry Failed...";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultMessage = "Exception occured during Question Entry...";
                oResult.ResultException = oEx;

                logger.Info("Exception QuestionEntry QuestionDAO+DAO", oEx);
            }

            logger.Info("End QuestionEntry QuestionDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This method inserts a Level
        /// </summary>
        /// <param name="oLevel"> It takes Level Object </param>
        /// <returns> It returns Result Object </returns>
        public Result LevelEntry(Level oLevel)
        {
            logger.Info("Start LevelEntry LevelDAO+DAO");

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

            String sInsert = String.Empty;

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

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

            try
            {
                sInsert = "if not exists(select LabelName from EX_Label where LabelName='" + oLevel.LevelName + "') insert into EX_Label(LabelID,LabelName,LabelPrerequisite)"
                +" values('"+oLevel.LevelID+"','"+oLevel.LevelName+"','"+oLevel.LevelDescription+"')";

                //oListString.Add(sInsert);

                //if (oDAOUtil.ExecuteNonQuery(oListString))
                //{
                //    oResult.ResultObject = oLevel;
                //    oResult.ResultMessage = "Level Entry Success(if not inserted, then level name is existed)...";
                //    oResult.ResultIsSuccess = true;
                //}
                //else
                //{
                //    oResult.ResultIsSuccess = false;
                //    oResult.ResultMessage = "Level Entry failed...";
                //}

                SqlCommand oSqlCommand = new SqlCommand(sInsert);
                oSqlCommand.CommandType = CommandType.Text;

                oListSqlCommand.Add(oSqlCommand);

                oListInt = oDAOUtil.ExecuteNonQueryForStoredProcedure(oListSqlCommand);

                if (oListInt.Count > 0)
                {
                    if (oListInt[0] > 0)
                    {
                        oResult.ResultObject = oLevel;
                        oResult.ResultMessage = "Level Entry Success...";
                        oResult.ResultIsSuccess = true;
                    }
                    else
                    {
                        oResult.ResultIsSuccess = false;
                        oResult.ResultMessage = "Level name is existed...";
                    }
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Level Entry failed...";
                }

            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Exception occured during Level Entry...";

                logger.Info("Exception LevelEntry LevelDAO+DAO", oEx);
            }

            logger.Info("End LevelEntry LevelDAO+DAO");

            return oResult;
        }
        //r
        /// <summary>
        /// This method deletes questions
        /// </summary>
        /// <param name="oListQuestion"> It takes List<Question> Object </param>
        /// <param name="iarrChecked"> It takes integer array indicates the marked questions </param>
        /// <returns> It returns Result Object </returns>
        public Result DeleteQuestionList(List<Question> oListQuestion, int[] iarrChecked)
        {
            logger.Info("Start DeleteQuestionList QuestionDAO+DAO");

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

            List<String> oListString = new List<String>();
            String sDelete = String.Empty;

            List<Question> oListQuestion1 = new List<Question>();

            int i = 0;

            try
            {
                for (i = 0; i < iarrChecked.Length; i++)
                {
                    if (iarrChecked[i] == 1 && !oListQuestion[i].QuestionIsUsed)
                    {
                        // Before delete, check that, is it used at the time of SETUP Question.
                        // If it is used, then u cannot delete it.

                        if (oListQuestion[i].QuestionQuestionType.QuestionTypeID==1)
                        {
                            sDelete = "delete from EX_Question where QuestionID='" + oListQuestion[i].QuestionID + "'";
                            oListQuestion1.Add(null);
                            oListString.Add(sDelete);

                        }
                        else
                        {
                            //first delete from EX_Objective, then from EX_Question
                            sDelete = "delete from EX_Objective where ObjectiveQuestionID='" + oListQuestion[i].QuestionID+"'";
                            oListString.Add(sDelete);
                            //sDelete = "delete from EX_Question where QuestionID='" + oListQuestion[i].QuestionID + "' and QuestionTypeName='" + oListQuestion[i].QuestionObjectiveType.TypeName + "'";
                            sDelete = "delete from EX_Question where QuestionID='" + oListQuestion[i].QuestionID + "'";
                            oListQuestion1.Add(null);
                            oListString.Add(sDelete);
                        }

                    }
                    else
                    {
                        oListQuestion1.Add(oListQuestion[i]);
                    }
                }

                oListQuestion1.RemoveAll(delegate(Question oQuestion) { if (oQuestion != null) { return false; } return true; });

                if (oDAOUtil.ExecuteNonQuery(oListString))
                {
                    oResult.ResultObject = oListQuestion1;

                    if (oListQuestion1.Count < oListQuestion.Count)
                    {
                        oResult.ResultMessage = "Question Delete Success...";
                    }
                    else if(oListQuestion1.Count==oListQuestion.Count)
                    {
                        oResult.ResultMessage = "Your selected questions are used...";
                    }

                    oResult.ResultIsSuccess = true;
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Question Delete Failed...";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Exception occured during Question Delete...";

                logger.Info("Exception DeleteQuestionList QuestionDAO+DAO", oEx);
            }

            logger.Info("End DeleteQuestionList QuestionDAO+DAO");

            return oResult;
        }
        //r
        /// <summary>
        /// This method insert a category if it is not existed
        /// </summary>
        /// <param name="oCategory"> It takes Category Object </param>
        /// <returns> It returns Result Object </returns>
        public Result CategoryEntry(Category oCategory)
        {
            //new CLogger("Start CategoryEntry CategoryDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start CategoryEntry CategoryDAO+DAO", ELogLevel.Debug);

            logger.Info("Start CategoryEntry CategoryDAO+DAO");

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

            SqlDataReader oSqlDataReader = null;

            String sSelectCategory = String.Empty;
            String sInsertCategory = String.Empty;

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

            bool flag = true;

            sSelectCategory = "select CategoryName from EX_Category where CategoryName='" + oCategory.CategoryName + "'";

            try
            {
                oSqlDataReader = oDAOUtil.GetReader(sSelectCategory);

                if (oSqlDataReader.HasRows)
                {
                    flag = false;
                }

                oSqlDataReader.Close();

                if (flag)
                {
                    sInsertCategory = "insert into EX_Category(CategoryName) values('" + oCategory.CategoryName + "')";

                    sListCategory.Add(sInsertCategory);

                    if (oDAOUtil.ExecuteNonQuery(sListCategory))
                    {
                        oResult.ResultObject = oCategory;
                        oResult.ResultMessage = "Category Entry Success...";
                        oResult.ResultIsSuccess = true;

                    }
                    else
                    {
                        oResult.ResultIsSuccess = false;
                        oResult.ResultMessage = "Category Entry Failed...";
                    }
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Category is already Existed";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultMessage = "Exception occured during Category Entry...";
                oResult.ResultException = oEx;

                logger.Info("Exception CategoryEntry CategoryDAO+DAO", oEx);

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

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

            logger.Info("End CategoryEntry CategoryDAO+DAO");

            return oResult;
        }
        //r
        /// <summary>
        /// This method setup the selected questions for an exam 
        /// </summary>
        /// <param name="oListQuestionSetup"> It takes List<QuestionSetup> Object </param>
        /// <param name="iarrChecked"> It takes integer array to indicates the marked questions </param>
        /// <returns> It returns Result Object </returns>
        public Result QuestionSetup(List<QuestionSetup> oListQuestionSetup, int[] iarrChecked)
        {
            logger.Info("Start QuestionSetup QuestionDAO+DAO");

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

            String sSelect = String.Empty;
            String sInsert = String.Empty;
            String sUpdate = String.Empty;

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

            List<QuestionSetup> oListSuccessQuestionSetup = new List<QuestionSetup>();

            SqlDataReader oSqlDataReader = null;

            int i = 0;

            try
            {
                foreach (QuestionSetup oQuestionSetup in oListQuestionSetup)
                {
                    if (iarrChecked[i] == 1)
                    {
                        Boolean flag = true;

                        sSelect = "select ExamID,QuestionID from EX_QuestionGeneration where ExamID='" + oQuestionSetup.QuestionSetupExam.ExamID + "' and QuestionID='" + oQuestionSetup.QuestionSetupQuestion.QuestionID + "'";

                        oSqlDataReader = oDAOUtil.GetReader(sSelect);
                        if (oSqlDataReader.HasRows)
                        {
                            flag = false;
                        }
                        oSqlDataReader.Close();

                        if (flag)
                        {
                            sInsert = "insert into EX_QuestionGeneration(ExamID,QuestionID,SetupQuestionMark,GeneratorID,GenerationTime) values('" + oQuestionSetup.QuestionSetupExam.ExamID + "','" + oQuestionSetup.QuestionSetupQuestion.QuestionID + "','" + oQuestionSetup.QuestionSetupMark + "','" + oQuestionSetup.QuestionSetupSystemUser.SystemUserID + "','" + oQuestionSetup.QuestionSetupGenerationTime + "')";
                            oListStringInsertUpdate.Add(sInsert);

                            oListSuccessQuestionSetup.Add(oQuestionSetup);
                        }

                    }
                    i++;
                }

                if (oListStringInsertUpdate.Count > 0) // any question is setup
                {
                    if (oDAOUtil.ExecuteNonQuery(oListStringInsertUpdate))
                    {
                        oResult.ResultMessage = "Question Setup Success...";
                        oResult.ResultObject = oListSuccessQuestionSetup;
                        oResult.ResultIsSuccess = true;
                    }
                    else
                    {
                        oResult.ResultIsSuccess = false;
                        oResult.ResultMessage = "Question Setup Failed...";
                    }
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Questions are all ready been Setup...";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Exception occured during Question Setup...";

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

            logger.Info("End QuestionSetup QuestionDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This method show all systemusers
        /// </summary>
        /// <returns> It returns Result Object </returns>
        public Result ShowAllSystemUsers()
        {
            logger.Info("Start ShowAllSystemUsers SystemUserDAO+DAO");

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

            SqlDataReader oSqlDataReader = null;

            List<SystemUser> oListSystemUser = new List<SystemUser>();

            String sSelect = String.Empty;

            DateTime oDateTime = DateTime.MinValue;

            try
            {
                sSelect = "select SystemUserID,SystemUserName,SystemUserPassword,DeleteTime,EmailAddress from EX_SystemUser where DeleteTime is NULL order by SystemUserName asc";

                oSqlDataReader = oDAOUtil.GetReader(sSelect);

                while (oSqlDataReader.Read())
                {
                    SystemUser oSystemUser = new SystemUser();

                    oSystemUser.SystemUserID = new Guid(oSqlDataReader["SystemUserID"].ToString());
                    oSystemUser.SystemUserName = oSqlDataReader["SystemUserName"].ToString();
                    oSystemUser.SystemUserPassword = oSqlDataReader["SystemUserPassword"].ToString();
                    oSystemUser.SystemUserEmail = oSqlDataReader["EmailAddress"].ToString();

                    if (DateTime.TryParse(oSqlDataReader["DeleteTime"].ToString(), out oDateTime))
                    {
                        oSystemUser.DeleteTime = DateTime.Parse(oSqlDataReader["DeleteTime"].ToString());
                    }

                    oListSystemUser.Add(oSystemUser);
                }

                oSqlDataReader.Close();

                oResult.ResultObject = oListSystemUser;
                oResult.ResultMessage = "System User Load Success...";
                oResult.ResultIsSuccess = true;
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "System User Show Exception...";

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

            logger.Info("End ShowAllSystemUsers SystemUserDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This method updates level information
        /// </summary>
        /// <param name="oLevel"> It takes Level Object </param>
        /// <returns> It returns Result Object </returns>
        public Result LevelUpdate(Level oLevel)
        {
            logger.Info("Start LevelUpdate LevelDAO+DAO");

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

            //String sUpdate = String.Empty;

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

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

            try
            {
                //sUpdate = "if not exists(select LabelName from EX_Label where LabelName='" + oLevel.LevelName + "')"
                //+ " update EX_Label set LabelName='" + oLevel.LevelName
                //+ "',LabelPrerequisite='" + oLevel.LevelDescription
                //+ "' where LabelID='" + oLevel.LevelID + "'";

                //sUpdate = "update EX_Label set"
                //    + " LabelName="
                //    + " ( case when not exists"
                //    + " (select LabelName from EX_Label where LabelName='" + oLevel.LevelName + "')"
                //    + " then '" + oLevel.LevelName + "'"
                //    + " end ),"
                //    + " LabelPrerequisite='" + oLevel.LevelDescription
                //    + "' where LabelID='" + oLevel.LevelID + "'";

                //oListString.Add(sUpdate);

                //if (oDAOUtil.ExecuteNonQuery(oListString))
                //{
                //    oResult.ResultObject = oLevel;
                //    oResult.ResultMessage = "Level Update Success(if not updated, then level name is existed)...";
                //    oResult.ResultIsSuccess = true;
                //}
                //else
                //{
                //    oResult.ResultIsSuccess = false;
                //    oResult.ResultMessage = "Level Update failed...";
                //}

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

                oSqlCommand.Parameters.Add("@LabelID", SqlDbType.UniqueIdentifier);
                oSqlCommand.Parameters["@LabelID"].Value = oLevel.LevelID;

                oSqlCommand.Parameters.Add("@LabelName", SqlDbType.VarChar);
                oSqlCommand.Parameters["@LabelName"].Value = oLevel.LevelName;

                oSqlCommand.Parameters.Add("@LabelPrerequisite", SqlDbType.VarChar);
                oSqlCommand.Parameters["@LabelPrerequisite"].Value = oLevel.LevelDescription;

                oListSqlCommand.Add(oSqlCommand);

                oListInt = oDAOUtil.ExecuteNonQueryForStoredProcedure(oListSqlCommand);

                if (oListInt.Count > 0)
                {
                    if (oListInt[0] > 0)
                    {
                        oResult.ResultObject = oLevel;
                        oResult.ResultMessage = "Level Update Success...";
                        oResult.ResultIsSuccess = true;
                    }
                    else
                    {
                        oResult.ResultIsSuccess = false;
                        oResult.ResultMessage = "Level name is existed...";
                    }
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Level Update failed...";
                }

            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Level Update Exception...";

                logger.Info("Exception LevelUpdate LevelDAO+DAO", oEx);
            }

            logger.Info("End LevelUpdate LevelDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This method sums the question categoty & question type wise obtain mark & total mark.
        /// </summary>
        /// <param name="oExam"> It takes Exam Object </param>
        /// <param name="oListCandidateMenu"> It takes List<CandidateMenu> Object </param>
        /// <returns> It returns Result Object </returns>
        public Result GetCandidateAVGMarksForTypeAndCategory(Exam oExam, List<CandidateMenu> oListCandidateMenu)
        {
            logger.Info("Start GetCandidateTotalMarksForTypeAndCategory ResultViewDAO+DAO");

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

            String sSelect = String.Empty;

            SqlDataReader oSqlDataReader = null;

            //CandidateResultsView oCandidateResultsView = new CandidateResultsView();

            //oCandidateResultsView.ListCandidates = new List<Candidate>();
            //oCandidateResultsView.ListOfListCandidateResults = new List<List<CandidateMenu>>();
            List<Candidate> oListCandidate = new List<Candidate>();

            Object oObject = new Object();

            try
            {

                DataTable dt = new DataTable();

                DataColumn dcolName = new DataColumn("Name", typeof(System.String));
                dt.Columns.Add(dcolName);

                float fTotalMarksForColumn = 0f;

                foreach (CandidateMenu oCandidateMenuInList in oListCandidateMenu) //columns
                {
                    foreach (QuestionType oQuestionTypeInList in oCandidateMenuInList.CandidateMenuCategoryQuestionType) //columns
                    {
                        float fMarkForAColumn = 0f;

                        object oObjectForMarkForAColumn = new object();

                        sSelect = " select sum(EX_QuestionGeneration.SetupQuestionMark) as TotalSetupMarkOfTypeOfCategory"
                                + " from EX_QuestionGeneration inner join EX_Question on EX_QuestionGeneration.QuestionID=EX_Question.QuestionID"
                                + " inner join EX_QuestionType on EX_QuestionType.TypeID = EX_Question.QuestionTypeID"
                                + " where EX_QuestionGeneration.ExamID='"+oExam.ExamID+"'"
                                + " and EX_Question.QuestionCategoryID='" + oCandidateMenuInList.CandidateMenuCategory.CategoryID + "'"
                                + " and EX_QuestionType.TypeID='" + oQuestionTypeInList.QuestionTypeID + "'";

                        oObjectForMarkForAColumn = oDAOUtil.GetExecuteScalar(sSelect);

                        if (oObjectForMarkForAColumn.ToString().Length <= 0)
                        {
                            fMarkForAColumn = 0f;
                        }
                        else
                        {
                            fMarkForAColumn = float.Parse(oObjectForMarkForAColumn.ToString());
                        }

                        fTotalMarksForColumn = fTotalMarksForColumn + fMarkForAColumn;

                        DataColumn dcolCategory = new DataColumn(oCandidateMenuInList.CandidateMenuCategory.CategoryName + "(" + oQuestionTypeInList.QuestionTypeName + ") = " + fMarkForAColumn.ToString(), typeof(System.Double));
                        dt.Columns.Add(dcolCategory);
                    }
                }

                DataColumn dcolTotal = new DataColumn("Total = " + fTotalMarksForColumn.ToString(), typeof(System.Double));
                dt.Columns.Add(dcolTotal);

                sSelect = "select distinct EX_CandidateExam.CandidateID,EX_Candidate.Name from"
                +" EX_Candidate inner join EX_CandidateExam on "
                +" EX_Candidate.CompositeCandidateID=EX_CandidateExam.CandidateID"
                +" where EX_CandidateExam.ExamID='"+oExam.ExamID+"'";

                oSqlDataReader = oDAOUtil.GetReader(sSelect);

                while (oSqlDataReader.Read())
                {
                    Candidate oCandidate = new Candidate();

                    oCandidate.CandidateCompositeID = oSqlDataReader["CandidateID"].ToString();
                    oCandidate.CandidateName = oSqlDataReader["Name"].ToString();

                    oListCandidate.Add(oCandidate);
                }

                oSqlDataReader.Close();

                //int iCandidateCount = 0;

                foreach (Candidate oCandidateInList in oListCandidate)
                {
                    DataRow drow = dt.NewRow();

                    int iColumnIndex = 0;

                    //********orginal*****//
                    //drow["Name"] = oCandidateInList.CandidateName;
                    drow[iColumnIndex++] = oCandidateInList.CandidateName;
                    //*******end orginal**********//

                    float fTotalMarks = 0f;

                    //List<CandidateMenu> oListCandidateMenuForView = new List<CandidateMenu>();

                    //for (int i = 0; i < oListCandidateMenu.Count; i++)
                    //{
                    //    oListCandidateMenuForView.Add(oListCandidateMenu[i]);
                    //}

                    //oCandidateResultsView.ListOfListCandidateResults.Add(oListCandidateMenuForView);

                    foreach (CandidateMenu oCandidateMenuInList in oListCandidateMenu)
                    {
                        //int iTypeCount = 0;

                        foreach (QuestionType oQuestionTypeInList in oCandidateMenuInList.CandidateMenuCategoryQuestionType)
                        {
                            //sSelect = "select sum(EX_CandidateExam.ObtainMark) as AvgTypeMark, 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_Question.QuestionID= EX_QuestionGeneration.QuestionID inner join EX_CandidateExam on EX_QuestionGeneration.QuestionID = EX_CandidateExam.QuestionID group by EX_CandidateExam.ExamID,EX_CandidateExam.CandidateID,EX_Question.QuestionCategoryID,EX_QuestionType.TypeID,EX_QuestionType.TypeName
                            //having EX_CandidateExam.ExamID='" + oExam.ExamID + "' and EX_CandidateExam.CandidateID='" + oCandidateInList.CandidateCompositeID + "'
                            //and EX_Question.QuestionCategoryID='" + oCandidateMenuInList.CandidateMenuCategory.CategoryID + "' and EX_QuestionType.TypeID='" + oQuestionTypeInList.QuestionTypeID+ "'";

                            sSelect = "select sum(EX_CandidateExam.ObtainMark) as AvgTypeMark, EX_QuestionType.TypeID,EX_QuestionType.TypeName"
                            +" from EX_CandidateExam inner join EX_Question on EX_CandidateExam.QuestionID=EX_Question.QuestionID"
                            +" inner join EX_QuestionType on EX_QuestionType.TypeID = EX_Question.QuestionTypeID"
                            + " where EX_CandidateExam.ExamID='" + oExam.ExamID + "' and"
                            + " EX_CandidateExam.CandidateID='" + oCandidateInList.CandidateCompositeID + "'"
                            +" and EX_Question.QuestionCategoryID='" + oCandidateMenuInList.CandidateMenuCategory.CategoryID + "'"
                            + " and EX_QuestionType.TypeID='" + oQuestionTypeInList.QuestionTypeID + "'"
                            +" group by EX_CandidateExam.ExamID,EX_CandidateExam.CandidateID,EX_Question.QuestionCategoryID,"
                            +" EX_QuestionType.TypeID,EX_QuestionType.TypeName";

                            oObject = oDAOUtil.GetExecuteScalar(sSelect);

                            if (oObject.ToString().Length <= 0)
                            {
                                //oQuestionTypeInList.AVGQuestionTypeMark = 0f;

                                //********orginal*****//
                                //drow[oCandidateMenuInList.CandidateMenuCategory.CategoryName + "(" + oQuestionTypeInList.QuestionTypeName + ")"] = 0f;
                                drow[iColumnIndex++] = 0f;
                                //*******end orginal**********//

                                fTotalMarks = fTotalMarks + 0f;

                                //oCandidateMenuInList.CandidateMenuCategoryQuestionType[iTypeCount].AVGQuestionTypeMark = 0f;

                            }
                            else
                            {
                                //oQuestionTypeInList.AVGQuestionTypeMark = float.Parse(oObject.ToString());
                                //oCandidateMenuInList.CandidateMenuCategoryQuestionType[iTypeCount].AVGQuestionTypeMark = float.Parse(oObject.ToString());

                                //********orginal*****//
                                //drow[oCandidateMenuInList.CandidateMenuCategory.CategoryName + "(" + oQuestionTypeInList.QuestionTypeName + ")"] = float.Parse(oObject.ToString());
                                drow[iColumnIndex++] = float.Parse(oObject.ToString());
                                //*******end orginal**********//

                                fTotalMarks = fTotalMarks + float.Parse(oObject.ToString());
                            }

                            //iTypeCount=iTypeCount+1;
                        }
                    }

                    //iCandidateCount = iCandidateCount + 1;
                    //oCandidateResultsView.ListOfListCandidateResults.Add(oListCandidateMenu);

                    //********orginal*****//
                    //drow["Total"] = fTotalMarks;
                    drow[iColumnIndex++] = fTotalMarks;
                    //*******end orginal**********//

                    dt.Rows.Add(drow);
                }

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

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

            logger.Info("End GetCandidateAVGMarksForTypeAndCategory ResultViewDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This method deletes a level if that level is not
        /// used for any question
        /// </summary>
        /// <param name="oLevel"> It takes Level Object </param>
        /// <returns> It returns Result Object </returns>
        public Result Delete(Level oLevel)
        {
            logger.Info("Start Delete LevelDAO+DAO");

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

            String sDelete= String.Empty;

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

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

            try
            {
                sDelete = "delete from EX_Label where EX_Label.LabelID='" + oLevel.LevelID + "' and EX_Label.LabelID not in (select EX_Question.QuestionLabelID from EX_Question where EX_Question.QuestionLabelID='" + oLevel.LevelID + "')";

                //oListString.Add(sDelete);

                //if (oDAOUtil.ExecuteNonQuery(oListString))
                //{
                //    oResult.ResultObject = oLevel;
                //    oResult.ResultMessage = "Level Delete Success(if not deleted, then it is used)...";
                //    oResult.ResultIsSuccess = true;
                //}
                //else
                //{
                //    oResult.ResultIsSuccess = false;
                //    oResult.ResultMessage = "Level Delete failed...";
                //}

                SqlCommand oSqlCommand = new SqlCommand(sDelete);
                oSqlCommand.CommandType = CommandType.Text;

                oListSqlCommand.Add(oSqlCommand);

                oListInt = oDAOUtil.ExecuteNonQueryForStoredProcedure(oListSqlCommand);

                if (oListInt.Count > 0)
                {
                    if (oListInt[0] > 0)
                    {
                        oResult.ResultObject = oLevel;
                        oResult.ResultMessage = "Level Delete Success...";
                        oResult.ResultIsSuccess = true;
                    }
                    else
                    {
                        oResult.ResultIsSuccess = false;
                        oResult.ResultMessage = "Level name is used...";
                    }
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Level Delete failed...";
                }

            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Level Delete Exception...";

                logger.Info("Exception Delete LevelDAO+DAO", oEx);
            }

            logger.Info("End Delete LevelDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This method show the questions according to question level.
        /// And these questions are already been setup.
        /// </summary>
        /// <param name="oQuestionSetup"> It takes QuestionSetup Object </param>
        /// <returns> It returns Result Object </returns>
        public Result QuestionSetupListShowByQuestionLevel(QuestionSetup oQuestionSetup)
        {
            logger.Info("Start QuestionSetupListShowByQuestionLevel QuestionDAO+DAO");

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

            String sSelect = String.Empty;

            List<QuestionSetup> oListQuestionSetup = new List<QuestionSetup>();

            SqlDataReader oSqlDataReader = null;

            try
            {
                if (oQuestionSetup.QuestionSetupQuestion.QuestionCreator.SystemUserName.Equals("administrator"))
                {
                    sSelect = "select EX_QuestionGeneration.ExamID,EX_QuestionGeneration.QuestionID,EX_QuestionGeneration.SetupQuestionMark,EX_QuestionGeneration.GeneratorID,"
                    +" EX_Question.QuestionText,EX_Question.QuestionTypeID,EX_Question.QuestionCategoryID,EX_Question.QuestionPossibleAnswerTime,"
                    +" EX_Question.QuestionLabelID,EX_Label.LabelName,EX_Label.LabelPrerequisite"
                    +" from EX_Label inner join EX_Question on EX_Label.LabelID=EX_Question.QuestionLabelID inner join"
                    + " EX_QuestionGeneration on EX_Question.QuestionID=EX_QuestionGeneration.QuestionID"
                    +" where EX_QuestionGeneration.ExamID='" + oQuestionSetup.QuestionSetupExam.ExamID + "' and EX_Question.QuestionTypeID='" + oQuestionSetup.QuestionSetupQuestion.QuestionQuestionType.QuestionTypeID + "'"
                    +" and EX_Question.QuestionCategoryID='" + oQuestionSetup.QuestionSetupQuestion.QuestionCategory.CategoryID + "'"
                    +" and EX_Question.QuestionLabelID='" + oQuestionSetup.QuestionSetupQuestion.QuestionLevel.LevelID+"'";
                }
                else
                {
                    sSelect = "select EX_QuestionGeneration.ExamID,EX_QuestionGeneration.QuestionID,EX_QuestionGeneration.SetupQuestionMark,EX_QuestionGeneration.GeneratorID,"
                        + " EX_Question.QuestionText,EX_Question.QuestionTypeID,EX_Question.QuestionCategoryID,EX_Question.QuestionPossibleAnswerTime,"
                        + " EX_Question.QuestionLabelID,EX_Label.LabelName,EX_Label.LabelPrerequisite"
                        + " from EX_Label inner join EX_Question on EX_Label.LabelID=EX_Question.QuestionLabelID inner join"
                        + " EX_QuestionGeneration on EX_Question.QuestionID=EX_QuestionGeneration.QuestionID"
                        +" where EX_QuestionGeneration.ExamID='" + oQuestionSetup.QuestionSetupExam.ExamID + "' and EX_QuestionGeneration.GeneratorID='" + oQuestionSetup.QuestionSetupQuestion.QuestionCreator.SystemUserID + "'"
                        +" and EX_Question.QuestionTypeID='" + oQuestionSetup.QuestionSetupQuestion.QuestionQuestionType.QuestionTypeID + "' and EX_Question.QuestionCategoryID='" + oQuestionSetup.QuestionSetupQuestion.QuestionCategory.CategoryID + "'"
                        + " and EX_Question.QuestionLabelID='" + oQuestionSetup.QuestionSetupQuestion.QuestionLevel.LevelID+"'";
                }

                oSqlDataReader = oDAOUtil.GetReader(sSelect);

                while (oSqlDataReader.Read())
                {
                    QuestionSetup oPopulatedQuestionSetup = new QuestionSetup();

                    oPopulatedQuestionSetup.QuestionSetupExam.ExamID = new Guid(oSqlDataReader["ExamID"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionID = new Guid(oSqlDataReader["QuestionID"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupMark = float.Parse(oSqlDataReader["SetupQuestionMark"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupSystemUser.SystemUserID = new Guid(oSqlDataReader["GeneratorID"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionText = oSqlDataReader["QuestionText"].ToString();
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionQuestionType.QuestionTypeID = int.Parse(oSqlDataReader["QuestionTypeID"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionCategory.CategoryID = int.Parse(oSqlDataReader["QuestionCategoryID"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionPossibleAnswerTime = float.Parse(oSqlDataReader["QuestionPossibleAnswerTime"].ToString());

                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionLevel.LevelID = new Guid(oSqlDataReader["QuestionLabelID"].ToString());
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionLevel.LevelName = oSqlDataReader["LabelName"].ToString();
                    oPopulatedQuestionSetup.QuestionSetupQuestion.QuestionLevel.LevelDescription = oSqlDataReader["LabelPrerequisite"].ToString();

                    oListQuestionSetup.Add(oPopulatedQuestionSetup);
                }

                oSqlDataReader.Close();

                oResult.ResultObject = oListQuestionSetup;
                oResult.ResultMessage = "QuestionSetupListShowByQuestionLevel success...";
                oResult.ResultIsSuccess = true;
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Exception occured during QuestionSetup ListShow ByQuestionLevel...";

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

            logger.Info("End QuestionSetupListShowByQuestionLevel QuestionDAO+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 remove the selected questions for an exam 
        /// </summary>
        /// <param name="oListQuestionSetup"> It takes List<QuestionSetup> Object </param>
        /// <param name="iarrChecked"> It takes integer array to indicates the marked questions </param>
        /// <returns> It returns Result Object </returns>
        public Result QuestionSetupRemove(List<QuestionSetup> oListQuestionSetup, int[] iarrChecked)
        {
            logger.Info("Start QuestionSetupRemove QuestionDAO+DAO");

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

            List<String> oListString = new List<String>();
            String sDelete = String.Empty;

            List<QuestionSetup> oListQuestionSetup1 = new List<QuestionSetup>();

            try
            {
                int i = 0;

                for (i = 0; i < iarrChecked.Length; i++)
                {
                    if (iarrChecked[i] == 1)
                    {
                        sDelete = "delete from EX_QuestionGeneration where ExamID='" + oListQuestionSetup[i].QuestionSetupExam.ExamID + "' and QuestionID='" + oListQuestionSetup[i].QuestionSetupQuestion.QuestionID + "' and GeneratorID='" + oListQuestionSetup[i].QuestionSetupSystemUser.SystemUserID + "'";
                        oListQuestionSetup1.Add(null);
                        oListString.Add(sDelete);
                    }
                    else
                    {
                        oListQuestionSetup1.Add(oListQuestionSetup[i]);
                    }
                }

                oListQuestionSetup1.RemoveAll(delegate(QuestionSetup oQuestionSetup) { if (oQuestionSetup != null) { return false; } return true; });

                if (oDAOUtil.ExecuteNonQuery(oListString))
                {
                    oResult.ResultObject = oListQuestionSetup1;
                    oResult.ResultMessage = "Question Setup Remove Success...";
                    oResult.ResultIsSuccess = true;
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Question Setup Remove Failed...";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultMessage = "Exception occured during Question Setup Remove...";
                oResult.ResultException = oEx;

                logger.Info("Exception QuestionSetupRemove QuestionDAO+DAO", oEx);
            }

            logger.Info("End QuestionSetupRemove QuestionDAO+DAO");

            return oResult;
        }
        //r
        /// <summary>
        /// This method Update a Question
        /// </summary>
        /// <param name="oQuestion"> It takes Question Object </param>
        /// <returns> It returns Result Object </returns>
        public Result UpdateQuestion(Question oQuestion)
        {
            logger.Info("Start UpdateQuestion QuestionDAO+DAO");

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

            List<String> oListString = new List<String>();
            String sString = String.Empty;

            int iBit = 0;

            try
            {
                sString = "update EX_Question set QuestionDefaultMark='" + oQuestion.QuestionDefaultMark + "',QuestionPossibleAnswerTime='"+oQuestion.QuestionPossibleAnswerTime +"' where QuestionID='" + oQuestion.QuestionID + "'";
                oListString.Add(sString);

                //if (!oQuestion.QuestionIsDescriptive)
                if (oQuestion.QuestionQuestionType.QuestionTypeID==0)
                {
                    sString = "delete from EX_Objective where ObjectiveQuestionID='" + oQuestion.QuestionID + "'";
                    oListString.Add(sString);

                    foreach (Choice oChoice in oQuestion.QuestionObjectiveType.ListOfChoices)
                    {
                        iBit = 0;

                        if (oChoice.ChoiceIsValid)
                        {
                            iBit = 1;
                        }

                        sString = "insert into EX_Objective(ObjectiveQuestionID,ObjectiveAnswer,ObjectiveAnswerIsValid) values('" + oQuestion.QuestionID + "','" + oChoice.ChoiceName + "','" + iBit + "')";
                        oListString.Add(sString);
                    }
                }

                if (oDAOUtil.ExecuteNonQuery(oListString))
                {
                    oResult.ResultObject = oQuestion;
                    oResult.ResultMessage = "Question Update Success...";
                    oResult.ResultIsSuccess = true;
                }
                else
                {
                    oResult.ResultIsSuccess = false;
                    oResult.ResultMessage = "Question Update Failed...";
                }
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Exception occured during Question Update...";

                logger.Info("Exception UpdateQuestion QuestionDAO+DAO", oEx);
            }

            logger.Info("End UpdateQuestion QuestionDAO+DAO");

            return oResult;
        }
        /// <summary>
        /// This method evaluate objective answers for all candidate of an exam.
        /// Only the administrator can call this method.
        /// It evaluates automatically
        /// </summary>
        /// <param name="oListCandidateForExamForGrid"> It takes List<CandidateForExam> Object </param>
        /// <param name="oExam"> It takes Exam Object </param>
        /// <param name="oSystemUser"> It takes SystemUser Object </param>
        /// <returns> It returns Result Object </returns>
        public Result EvaluateObjectiveAnswersForAllCandidateOfAnExma(List<CandidateForExam> oListCandidateForExamForGrid, SystemUser oSystemUser, Exam oExam)
        {
            //new CLogger("Start EvaluateObjectiveAnswersForAllCandidateOfAnExma EvaluateProcessDAO+DAO", FileNameManagerInDLL.sLogFileName, 1).WriteLog("Start EvaluateObjectiveAnswersForAllCandidateOfAnExma EvaluateProcessDAO+DAO", ELogLevel.Debug);

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

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

            SqlDataReader oSqlDataReader = null;

            String sSelect = String.Empty;

            try
            {
                foreach (CandidateForExam oCandidateForExamInList in oListCandidateForExamForGrid)
                {
                    List<CandidateAnswerQuestion> oListCandidateAnswerQuestion = new List<CandidateAnswerQuestion>();

                    oResult = LoadQuestionsForACandidateWhichSetupByAParticularUser(oCandidateForExamInList.CandidateForExamCandidate.CandidateCompositeID, oExam, oSystemUser, true);

                    if (oResult.ResultIsSuccess)
                    {
                        oListCandidateAnswerQuestion = (List<CandidateAnswerQuestion>)oResult.ResultObject;

                        foreach (CandidateAnswerQuestion oCandidateAnswerQuestionInList in oListCandidateAnswerQuestion)
                        {
                            if (oCandidateAnswerQuestionInList.QuestionForCandidateAnswer.QuestionQuestionType.QuestionTypeID == 0)
                            {
                                if (oSystemUser.SystemUserName.ToLower().Equals("administrator"))
                                {
                                    //sSelect = "select EX_Objective.ObjectiveQuestionID,EX_Objective.ObjectiveAnswer,EX_Objective.ObjectiveAnswerIsValid from EX_Objective inner join EX_Question on EX_Objective.ObjectiveQuestionID = EX_Question.QuestionID inner join EX_QuestionGeneration on EX_Question.QuestionID = EX_QuestionGeneration.QuestionID inner join EX_CandidateExam on EX_CandidateExam.QuestionID=EX_QuestionGeneration.QuestionID where EX_CandidateExam.QuestionID='" + oCandidateAnswerQuestionInList.QuestionForCandidateAnswer.QuestionID + "' and EX_CandidateExam.CandidateID='" + oCandidateInList.CandidateCompositeID + "' and EX_CandidateExam.ExamID='" + oExam.ExamID + "' and EX_CandidateExam.QuestionID in (select EX_QuestionGeneration.QuestionID from EX_QuestionGeneration where EX_QuestionGeneration.ExamID='" + oExam.ExamID + "' and EX_QuestionGeneration.GeneratorID='" + oSystemUser.SystemUserID + "')";
                                    //sSelect = "select distinct EX_Objective.ObjectiveQuestionID,EX_Objective.ObjectiveAnswer,"
                                    //+" EX_Objective.ObjectiveAnswerIsValid from EX_Objective inner join EX_Question"
                                    //+" on EX_Objective.ObjectiveQuestionID = EX_Question.QuestionID inner join EX_QuestionGeneration"
                                    //+" on EX_Question.QuestionID = EX_QuestionGeneration.QuestionID inner join EX_CandidateExam"
                                    //+" on EX_CandidateExam.QuestionID=EX_QuestionGeneration.QuestionID"
                                    //+" where EX_CandidateExam.QuestionID='" + oCandidateAnswerQuestionInList.QuestionForCandidateAnswer.QuestionID + "'"
                                    //+" and EX_CandidateExam.CandidateID='" + oCandidateForExamInList.CandidateForExamCandidate.CandidateCompositeID + "'"
                                    //+" and EX_CandidateExam.ExamID='" + oExam.ExamID + "' and EX_CandidateExam.QuestionID"
                                    //+" in (select EX_QuestionGeneration.QuestionID from EX_QuestionGeneration"
                                    //+" where EX_QuestionGeneration.ExamID='" + oExam.ExamID + "')";

                                    sSelect = "select EX_Objective.ObjectiveQuestionID,EX_Objective.ObjectiveAnswer,"
                                    + " EX_Objective.ObjectiveAnswerIsValid from EX_Objective inner join EX_CandidateExam"
                                    + " on EX_CandidateExam.QuestionID=EX_Objective.ObjectiveQuestionID"
                                    + " where EX_CandidateExam.QuestionID='" + oCandidateAnswerQuestionInList.QuestionForCandidateAnswer.QuestionID + "'"
                                    + " and EX_CandidateExam.CandidateID='" + oCandidateForExamInList.CandidateForExamCandidate.CandidateCompositeID + "'"
                                    + " and EX_CandidateExam.ExamID='" + oExam.ExamID + "' and EX_CandidateExam.QuestionID"
                                    + " in (select EX_QuestionGeneration.QuestionID from EX_QuestionGeneration"
                                    + " where EX_QuestionGeneration.ExamID='" + oExam.ExamID + "')";
                                }

                                String sCheckValid = String.Empty;
                                String sCheckName = String.Empty;

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

                                oSqlDataReader = oDAOUtil.GetReader(sSelect);

                                while (oSqlDataReader.Read())
                                {
                                    Choice oChoice = new Choice();

                                    oChoice.ChoiceIsValid = Boolean.Parse(oSqlDataReader["ObjectiveAnswerIsValid"].ToString());
                                    oChoice.ChoiceName = oSqlDataReader["ObjectiveAnswer"].ToString();

                                    oListChoices.Add(oChoice);
                                }

                                oSqlDataReader.Close();

                                oCandidateAnswerQuestionInList.QuestionForCandidateAnswer.QuestionObjectiveType.ListOfChoices = oListChoices;
                            }
                        }

                        oCandidateForExamInList.CadidateCandidateExam.CandidateAnsweredQuestions = oListCandidateAnswerQuestion;
                    }
                }

                oResult.ResultObject = oListCandidateForExamForGrid;
                oResult.ResultMessage = "Objective answers are evaluated for all candidate of this exam...";
                oResult.ResultIsSuccess = true;
            }
            catch (Exception oEx)
            {
                oResult.ResultIsSuccess = false;
                oResult.ResultException = oEx;
                oResult.ResultMessage = "Exception occured at evaluation of objective answers for all candidate of this exam...";

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

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

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

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

            return oResult;
        }