/// <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();
        }