/// <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> /// Получить задание по 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="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> /// Редактировать/Добавить задание /// </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="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); }