/// <summary> /// Metoda służąca do usuwania z bazy danych danego typu urlopu. /// </summary> /// <param name="form">Formularz wywołujący metodę.</param> /// <param name="deletedType">Nazwa usuwanego typu urlopu.</param> /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception> /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception> /// <exception cref="IsolationLevelException">Wyjątek występuje, gdy poziom izolacji uruchomionej w /// formularzu transakcji jest zbyt niski do zapewnienia poprawnego wykonania poleceń metody.</exception> public static void DeleteLeaveType(this FormDeleteLeaveType form, LeaveType deletedType) { DeleteLeaveType((LeaveManagerForm)form, deletedType); }
/// <summary> /// Metoda służąca do usuwania z bazy danych danego typu urlopu. /// </summary> /// <param name="form">Formularz wywołujący metodę.</param> /// <param name="deletedType">Nazwa usuwanego typu urlopu.</param> /// <exception cref="SqlException">An exception occurred while executing the command against a locked row.</exception> /// <exception cref="InvalidOperationException">The current state of the connection is closed.</exception> /// <exception cref="IsolationLevelException">Wyjątek występuje, gdy poziom izolacji uruchomionej w /// formularzu transakcji jest zbyt niski do zapewnienia poprawnego wykonania poleceń metody.</exception> private static void DeleteLeaveType(LeaveManagerForm form, LeaveType deletedType) { /* Dla poprawnego działania tej metody konieczne jest aby posiadała ona transakcję * o odpowiednim poziomie izolacji. */ //Zmienna przechowująca stan transakcji przed uruchomieniem metody. bool isFormTransactionOn = form.TransactionOn; //Jeżeli formularz posiada uruchomioną transakcję. if (form.TransactionOn) { //Sprawdzenie, czy poziom izolacji istniejącej transakcji jest wystarczający. if (form.Transaction.IsolationLevel != IsolationLevel.RepeatableRead && form.Transaction.IsolationLevel != IsolationLevel.Serializable) { throw new IsolationLevelException(); } } else//Jeżeli formularz nie posiada uruchomionej transakcji. //Uruchomienie nowej transakcji na potrzeby tej metody z odpowiednim poziomem izolacji. form.BeginTransaction(IsolationLevel.RepeatableRead); try { SqlCommand commandGetLeavesToDelete = new SqlCommand("SELECT L.Leave_ID, L.Employee_ID, LS.Name AS 'Status', " + "L.First_day, L.Last_day, L.Remarks, L.Used_days FROM Leave L, Status_type LS WHERE " + "L.LS_ID = LS.ST_ID AND L.LT_ID = @LT_ID", form.Connection, form.Transaction); commandGetLeavesToDelete.Parameters.AddWithValue("@LT_ID", deletedType.Id); SqlDataReader reader = commandGetLeavesToDelete.ExecuteReader(); List<Leave> leaveEntriesToDelete = new List<Leave>(); while (reader.Read()) { leaveEntriesToDelete.Add(new Leave((int)reader["Leave_ID"], (int)reader["Employee_ID"], deletedType.Name, reader["Status"].ToString(), (DateTime)reader["First_day"], (DateTime)reader["Last_day"], reader["Remarks"].ToString(), (int)reader["Used_days"])); } reader.Close(); foreach (Leave leave in leaveEntriesToDelete) { DeleteLeave(form, leave.Id); } SqlCommand commandDeleteType = new SqlCommand("DELETE FROM Leave_type WHERE LT_ID = @LT_ID", form.Connection, form.Transaction); commandDeleteType.Parameters.AddWithValue("@LT_ID", deletedType.Id); commandDeleteType.ExecuteNonQuery(); } catch (Exception e) { //Jeżeli transakcja formularza była uruchomiona tylko na potrzeby tej metody, to ją cofamy. if (!isFormTransactionOn) form.RollbackTransaction(); //Wyrzucamy wyjątek do dalszej obsługi. throw e; } //Jeżeli operacja powiodła się, a transakcja była uruchomiona tylko na potrzeby tej metody to ją zatwierdzamy. if (!isFormTransactionOn) form.CommitTransaction(); }