/// <summary> /// Добавить прогресс пользователю /// </summary> /// <param name="login">Логин</param> /// <param name="rigthAnswers">Кол-во верно решённых заданий</param> /// <param name="totalQuestions">Общее число заданий в тесте</param> /// <returns></returns> public static object AddUserProgress(string login = "", int rigthAnswers = 0, int totalQuestions = 0) { object res = null; if (login != "") { try { using (var context = new TrainSQL_Entities()) { Progress progress = new Progress() { Login = login, TestDate = DateTime.Now, RightAnswersQuantity = rigthAnswers, TotalQuastionsQuantity = totalQuestions }; context.Progresses.Add(progress); context.SaveChanges(); } } catch (Exception ex) { res = ex; } } return(res); }
/// <summary> /// Редактировать/Добавить тему /// </summary> /// <param name="newTheme">Новая тема</param> /// <returns></returns> public static object EditORAddTheme(Theme newTheme = null) { object res = null; if (newTheme != null) { try { using (var context = new TrainSQL_Entities()) { if (IsThemeExists(newTheme.ThemeID)) { context.Themes.FirstOrDefault(x => x.ThemeID == newTheme.ThemeID).ThemeName = newTheme.ThemeName; context.Themes.FirstOrDefault(x => x.ThemeID == newTheme.ThemeID).Theory = newTheme.Theory; } else { context.Themes.Add(newTheme); } context.SaveChanges(); } } catch (Exception ex) { res = ex; MessageBox.Show(ex.ToString()); } } return(res); }
/// <summary> /// Удалить задание /// </summary> /// <param name="task">Задание</param> /// <returns></returns> public static object DeleteTask(TrainSQL_DAL.Task task = null) { object result = null; if (task != null) { try { using (var context = new TrainSQL_Entities()) { var delTask = context.Tasks.FirstOrDefault(x => x.TaskID == task.TaskID); if (delTask != null) { context.Tasks.Remove(delTask); } context.SaveChanges(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); result = ex; } } return(result); }
/// <summary> /// Удалить жалобу /// </summary> /// <param name="complaint">Жалоба</param> /// <returns></returns> public static object DeleteComplaint(Complaint complaint = null) { object res = null; if (complaint != null) { try { using (var context = new TrainSQL_Entities()) { var item = context.Complaints.FirstOrDefault(x => x.ComplaintID == complaint.ComplaintID); if (item != null) { context.Complaints.Remove(item); context.SaveChanges(); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } return(res); }
/// <summary> /// Удалить тему /// </summary> /// <param name="theme">Тема</param> /// <returns></returns> public static object DeleteTheme(Theme theme = null) { object result = null; if (theme != null) { try { using (var context = new TrainSQL_Entities()) { var delTheme = context.Themes.FirstOrDefault(x => x.ThemeID == theme.ThemeID); if (delTheme != null) { context.Themes.Remove(delTheme); } context.SaveChanges(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); result = ex; } } return(result); }
/// <summary> /// Получить индекс темы /// </summary> /// <param name="themeID">ID темы</param> /// <returns></returns> public static int GetThemeIndex(int themeID = 0) { int index = 0; if (themeID != 0) { using (var context = new TrainSQL_Entities()) { index = context.Themes.ToList().FindIndex(x => x.ThemeID == themeID); } } return(index); }
/// <summary> /// Проверка, зарегистрирован ли пользователь с таким email /// </summary> /// <param name="email">email пользователя</param> /// <returns></returns> public static bool IsEmailRegistered(string email = "") { bool emailRegistered = false; try { using (var context = new TrainSQL_Entities()) { emailRegistered = context.Users.FirstOrDefault(x => x.UserEmail == email) != null; } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } return(emailRegistered); }
/// <summary> /// Посик пользователя по логину /// </summary> /// <param name="login">Логин пользователя</param> /// <returns></returns> public static User FindUser(string login = "") { User user = null; try { using (var context = new TrainSQL_Entities()) { user = context.Users.FirstOrDefault(x => x.Login == login); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } return(user); }
/// <summary> /// Проверка на существование пользователя по логину /// </summary> /// <param name="login">Логин пользователя</param> /// <returns></returns> public static bool IsUserExists(string login = "") { bool userExists = false; try { using (var context = new TrainSQL_Entities()) { userExists = context.Users.FirstOrDefault(x => x.Login == login) != null; } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } return(userExists); }
/// <summary> /// Получить список всех жалоб /// </summary> /// <returns></returns> public static List <Complaint> GetAllComplaints() { List <Complaint> result = null; try { using (var context = new TrainSQL_Entities()) { result = context.Complaints.ToList(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } return(result); }
/// <summary> /// Получить список тестовых баз данных /// </summary> /// <returns></returns> public static List <TestDatabas> GetDatabases() { List <TestDatabas> testDBs = null; try { using (var context = new TrainSQL_Entities()) { testDBs = context.TestDatabases.ToList(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } return(testDBs); }
public static object ChangeUserProperty(User user = null, string columnName = "", string newProperty = "") { if (user != null) { using (var context = new TrainSQL_Entities()) { try { switch (columnName) { case nameof(user.Login): context.Users.FirstOrDefault(x => x.Login == user.Login).Login = newProperty; break; case nameof(user.Password): context.Users.FirstOrDefault(x => x.Login == user.Login).Password = newProperty; break; case nameof(user.RoleID): context.Users.FirstOrDefault(x => x.Login == user.Login).RoleID = Convert.ToInt32(newProperty); break; default: return(new Exception()); break; } context.SaveChanges(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); return(ex); } } return(null); } return(new ArgumentNullException()); }
/// <summary> /// Получить задание по ID /// </summary> /// <param name="taskID">ID задания</param> /// <returns></returns> public static TrainSQL_DAL.Task GetTaskByID(int taskID = 0) { TrainSQL_DAL.Task task = null; if (taskID != 0) { try { using (var context = new TrainSQL_Entities()) { task = context.Tasks.FirstOrDefault(x => x.TaskID == taskID); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } return(task); }
/// <summary> /// Существует ли тема /// </summary> /// <param name="themeID">ID темы</param> /// <returns></returns> public static bool IsThemeExists(int themeID = 0) { bool isExists = false; if (themeID != 0) { try { using (var context = new TrainSQL_Entities()) { isExists = context.Themes.FirstOrDefault(x => x.ThemeID == themeID) != null; } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } return(isExists); }
/// <summary> /// Получить список жалоб от 1 пользователя /// </summary> /// <param name="login">Логин</param> /// <returns></returns> public static List <Complaint> GetComplaintsByLogin(string login = "") { List <Complaint> result = null; if (login != "") { try { using (var context = new TrainSQL_Entities()) { result = context.Complaints.Where(x => x.Login == login).ToList(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } return(result); }
/// <summary> /// Роль пользователя /// </summary> /// <param name="user">Пользователь</param> /// <returns></returns> public static string GetUserRole(User user) { string roleName = ""; try { if (user != null) { using (var context = new TrainSQL_Entities()) { roleName = context.Roles.FirstOrDefault(x => x.RoleID == user.RoleID).RoleName; } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } return(roleName); }
/// <summary> /// Получить жалобы по заданию /// </summary> /// <param name="taskID">ID задания</param> /// <returns></returns> public static List <Complaint> GetComplaintsByTask(int taskID = 0) { List <Complaint> result = null; if (taskID != 0) { try { using (var context = new TrainSQL_Entities()) { result = context.Complaints.Where(x => x.TaskID == taskID).ToList(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } return(result); }
/// <summary> /// Получить список случайных заданий для теста /// </summary> /// <param name="count">Кол-во заданий в тесте</param> /// <returns></returns> public static List <TrainSQL_DAL.Task> GetTestList(int count = 0) { List <TrainSQL_DAL.Task> result = null; if (count > 0) { result = new List <TrainSQL_DAL.Task>(); try { using (var context = new TrainSQL_Entities()) { // Случайный номер задания int rand = new Random().Next(context.Tasks.ToList().Count()); // Само задание TrainSQL_DAL.Task task = context.Tasks.ToList()[rand]; // Добавить задание в список заданий result.Add(task); while (result.Count < 5) { // Получить новое задание rand = new Random().Next(context.Tasks.ToList().Count()); task = context.Tasks.ToList()[rand]; // Если задания нет в списке, то добавить if (!result.Contains(task)) { result.Add(task); } } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } return(result); }
/// <summary> /// Получить тему по ID /// </summary> /// <param name="themeID">ID темы</param> /// <returns></returns> public static Theme GetThemeByThemeID(int themeID) { Theme theme = null; if (themeID != 0 && IsThemeExists(themeID)) { try { using (var context = new TrainSQL_Entities()) { theme = context.Themes.FirstOrDefault(x => x.ThemeID == themeID); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } return(theme); }
/// <summary> /// Отправить жалобу /// </summary> /// <param name="complaint">Жалоба</param> /// <returns></returns> public static object SendComplaint(Complaint complaint = null) { if (complaint != null) { try { using (var context = new TrainSQL_Entities()) { complaint.ComplaintID = context.Complaints.ToList().Last().ComplaintID + 1; context.Complaints.Add(complaint); context.SaveChanges(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); return(ex); } } return(null); }
/// <summary> /// Получить /// </summary> /// <param name="dbID"></param> /// <returns></returns> public static Sheme GetDbSheme(int dbID = 0) { Sheme sheme = null; try { using (var context = new TrainSQL_Entities()) { TestDatabas testDB = context.TestDatabases.FirstOrDefault(x => x.dbID == dbID); if (testDB != null) { sheme = context.Shemes.FirstOrDefault(x => x.ShemeID == testDB.ShemeID); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } return(sheme); }
/// <summary> /// Получить прогресс пользователя /// </summary> /// <param name="login"></param> /// <returns></returns> public static List <Progress> GetUserProgress(string login = "") { List <Progress> userProgress = null; if (login != "") { try { using (var context = new TrainSQL_Entities()) { if (context.Progresses.FirstOrDefault(x => x.Login == login) != null) { if (context.Progresses.Where(x => x.Login == login).Count() > 14) { userProgress = (from el in context.Progresses where el.Login == login orderby el.TestDate descending select el).Take(15).ToList(); userProgress.Reverse(); } else { userProgress = (from el in context.Progresses where el.Login == login orderby el.TestDate select el).ToList(); } } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } return(userProgress); }
/// <summary> /// Редактировать/Добавить задание /// </summary> /// <param name="newTask">Задание</param> /// <returns></returns> public static object EditORAddTask(TrainSQL_DAL.Task newTask = null) { object res = null; if (newTask != null) { try { using (var context = new TrainSQL_Entities()) { if (IsTaskExists(newTask.TaskID)) { context.Tasks.FirstOrDefault(x => x.TaskID == newTask.TaskID).TaskText = newTask.TaskText; context.Tasks.FirstOrDefault(x => x.TaskID == newTask.TaskID).RightAnswer = newTask.RightAnswer; context.Tasks.FirstOrDefault(x => x.TaskID == newTask.TaskID).dbID = newTask.dbID; } else { context.Tasks.Add(new TrainSQL_DAL.Task() { TaskText = newTask.TaskText, RightAnswer = newTask.RightAnswer, dbID = newTask.dbID }); } context.SaveChanges(); } } catch (Exception ex) { res = ex; MessageBox.Show(ex.ToString()); } } return(res); }
/// <summary> /// Показать тему /// </summary> /// <param name="index">Индекс темы</param> /// <returns></returns> public static Theme ShowTheme(int index = -1) { Theme theme = null; if (index > -1) { try { using (var context = new TrainSQL_Entities()) { if (index < context.Themes.Count()) { theme = context.Themes.ToList()[index]; } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } return(theme); }
/// <summary> /// Добавление польхователя /// </summary> /// <param name="newUser">Новый пользователь</param> /// <returns></returns> public static object AddUser(User newUser = null) { if (newUser != null) { using (var context = new TrainSQL_Entities()) { try { context.Users.Add(newUser); AddUserProgress(newUser.Login, 0, 5); context.SaveChanges(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); return(ex); } } return(null); } return(new ArgumentNullException()); }
/// <summary> /// Проверка задания /// </summary> /// <param name="query">Запрос пользователя</param> /// <param name="dbID">ID тестовой базы данных, к который нужно выполнить запрос</param> /// <returns></returns> public static object TaskChecking(string query = "", int dbID = 0) { // Результат теста запроса object[] res = null; // Проверка, не является ли запрос пустой строкой if (query != "" && dbID != 0) { query = query.ToLower().Trim(); // Список имён тестовых БД List <TestDatabas> testDBList = new List <TestDatabas>(); // Есть ли в запросе слово для редактирования таблицы bool isInsert = query.Contains("insert"); bool isUpdate = query.Contains("update"); bool isDelete = query.Contains("delete"); // Условие, изменят ли запрос пользователя таблицу или нет bool isChangingQuery = isInsert || isUpdate || isDelete; // Название БД, по которой строится DataTable string mainDB = null; // Текущая таблица string currTable = null; // DataTable для вывода DataTable resultTable = null; // Сообщение об ошибке string error = null; try { using (var context = new TrainSQL_Entities()) { // ID схемы тестовой БД int shemeID = context.TestDatabases.FirstOrDefault(x => x.dbID == dbID).ShemeID; // Список тестовых БД // есть несколько БД с одинаковой схемой, но разными данными, // что позволяет проверять корректность запроса, а не сам результат его выполнения testDBList = (from x in context.TestDatabases where x.ShemeID == shemeID select x).ToList(); } } catch (Exception ex) { error = ex.Message; } if (testDBList.Count == 0) { return(null); } // Получить название БД для вывода результата пользователю mainDB = testDBList.FirstOrDefault(x => !char.IsDigit(x.dbName.Last())).dbName; currTable = testDBList.FirstOrDefault(x => x.dbID == dbID).dbName; if (mainDB != null) { try { // Проверка, меняет ли запрос таблицу в БД if (isChangingQuery) { connectionBuilder.InitialCatalog = mainDB; using (SqlConnection connection = new SqlConnection(connectionBuilder.ConnectionString)) { connection.Open(); resultTable = GetDataTable(query, connection); connection.Close(); } } else { for (int i = 0; i < testDBList.Count && error == null; i++) { connectionBuilder.InitialCatalog = testDBList[i].dbName; DataTable checkingDT; using (SqlConnection connection = new SqlConnection(connectionBuilder.ConnectionString)) { connection.Open(); checkingDT = GetDataTable(query, connection); if (testDBList[i].dbName == currTable) { resultTable = checkingDT; } if (checkingDT == null) { error = $"Запрос к таблице {testDBList[i].dbName} не дал результатов"; } connection.Close(); } } } } catch (ObjectDisposedException ex) { error = "Попытка выполнить оперции над удалённым объектом (ObjectDisposedException)!\n" + ex.Message; } catch (InvalidCastException ex) { error = "Недопустимое приведение/преобразование (InvalidCastException)!\n" + ex.Message; } catch (SqlException ex) { error = "Ошибка SQL!\n" + ex.Message; } catch (InvalidOperationException ex) { error = "Состояние объекта блокирует вызов метода (InvalidOperationException)!\n" + ex.Message; } catch (Exception ex) { error = "Ошибка dремени выполнения!" + ex.Message; } } res = new object[] { resultTable, error }; } return(res); }
/// <summary> /// Проверка запроса пользователя с ожидаемым /// </summary> /// <param name="userQuery"></param> /// <param name="task"></param> /// <returns></returns> public static object IsCorrectQuery(string userQuery, TrainSQL_DAL.Task task) { object res = null; string rightQuery = task.RightAnswer.ToLower().Trim(); userQuery = userQuery.ToLower().Trim(); List <string> testDBList = new List <string>(); // Список имён тестовых БД bool isInsert = rightQuery.Contains("insert"); bool isUpdate = rightQuery.Contains("update"); bool isDelete = rightQuery.Contains("delete"); bool isChangingQuery = isInsert || isUpdate || isDelete; string mainDB = null; // название БД, по которой строится DataTable DataTable resultTable = null; // DataTable для вывода string error = null; // Сообщение об ошибке if (userQuery.Length != 0) { // Заполнение списка try { using (var context = new TrainSQL_Entities()) { int shemeID = context.TestDatabases.FirstOrDefault(x => x.dbID == task.dbID).ShemeID; testDBList = (from x in context.TestDatabases where x.ShemeID == shemeID select x.dbName).ToList(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } if (testDBList == null || testDBList.Count == 0) { return(null); } mainDB = testDBList.FirstOrDefault(x => !char.IsDigit(x.Last())); // получение названия БД для вывода if (mainDB != null) { DataTable userTable = new DataTable(); DataTable rightTable = new DataTable(); connectionBuilder.InitialCatalog = mainDB; try { using (SqlConnection connection = new SqlConnection(connectionBuilder.ConnectionString)) { connection.Open(); // Получить таблицу вывода resultTable = GetDataTable(userQuery, connection); // Получить ожидаемую тублицу rightTable = GetDataTable(rightQuery, connection); if (isChangingQuery) { SqlTransaction transaction = connection.BeginTransaction(); string tbName = ""; SqlCommand command; command = new SqlCommand(userQuery, connection); command.Transaction = transaction; if (userQuery.Contains("insert") || userQuery.Contains("update") || userQuery.Contains("delete")) { command.ExecuteNonQuery(); } tbName = GetTableName(rightQuery.ToLower()); command = new SqlCommand($"SELECT * FROM {tbName}", connection); command.Transaction = transaction; SqlDataReader reader = command.ExecuteReader(); userTable.Load(reader); reader.Close(); transaction.Rollback(); } else { userTable = resultTable; } error = AreTablesTheSame(userTable, rightTable); connection.Close(); } if (error != null) { if (isInsert) { error = "Операция \"insert\" выполнена неверно или вовсе не выполнена"; } else if (isUpdate) { error = "Операция \"update\" выполнена неверно или вовсе не выполнена"; } else if (isDelete) { error = "Операция \"delete\" выполнена неверно или вовсе не выполнена"; } } else { if (!isChangingQuery) { int i = 1; for (; i < testDBList.Count() && error == null; i++) { error = CheckQuery(userQuery, rightQuery, testDBList[i]); } if (error != null) { error = $"Запрос не прошёл проверку на {i + 1} базе данных"; } } } } catch (ObjectDisposedException ex) { error = "Попытка выполнить оперции над удалённым объектом (ObjectDisposedException)!\n" + ex.Message; } catch (InvalidCastException ex) { error = "Недопустимое приведение/преобразование (InvalidCastException)!\n" + ex.Message; } catch (SqlException ex) { error = "Ошибка SQL!\n" + ex.Message; } catch (InvalidOperationException ex) { error = "Состояние объекта блокирует вызов метода (InvalidOperationException)!\n" + ex.Message; } catch (Exception ex) { error = "Ошибка dремени выполнения!" + ex.Message; } } } res = new object[] { resultTable, error }; return(res); }