/// <summary>
        /// Metoda ustawiania godzin pracy pracownika.
        /// </summary>
        /// <param name="form">Formularz wywołujący</param>
        /// <param name="hours">Tablica 14 elementów zawierająca godziny rozpoczęcia i zakończenia pracy
        /// w kolejnych dniach tygodnia. Np. hours[0] == godzina rozpoczęcia pracy w poniedziałek, 
        /// hours[1] == godzina zakończenia pracy w poniedziałek,
        /// hours[2] == godzina rozpoczęcia pracy we wtorek itd.
        /// 
        /// Format godziny to dd:mm:[ss[.nnnnnnn]]</param>
        /// <param name="employeeId">Numer id pracownika, któremu zmieniamy harmonogram.</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>
        /// <exception cref="ArgumentException">Występuje w przypadku próby odjęcia większej liczby dni, niż pracownik posiada.</exception>
        private static void SetSchedule(LeaveManagerForm form, string[] hours, int employeeId)
        {
            /* 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
            {
                if (hours.Length != 14)
                {
                    throw new ArgumentException();
                }
                using (SqlCommand command = new SqlCommand("UPDATE Work_hours " +
                    "SET " +
                    "MondayStart = @MondayStart, " +
                    "MondayEnd = @MondayEnd, " +

                    "TuesdayStart = @TuesdayStart, " +
                    "TuesdayEnd = @TuesdayEnd, " +

                    "WednesdayStart = @WednesdayStart, " +
                    "WednesdayEnd = @WednesdayEnd, " +

                    "ThursdayStart = @ThursdayStart, " +
                    "ThursdayEnd = @ThursdayEnd, " +

                    "FridayStart = @FridayStart, " +
                    "FridayEnd = @FridayEnd, " +

                    "SaturdayStart = @SaturdayStart, " +
                    "SaturdayEnd = @SaturdayEnd, " +

                    "SundayStart = @SundayStart, " +
                    "SundayEnd = @SundayEnd " +
                    "WHERE Employee_ID = @Employee_ID", form.Connection, form.Transaction))
                {
                    command.Parameters.AddWithValue("@MondayStart", hours[0]);
                    command.Parameters.AddWithValue("@MondayEnd", hours[1]);

                    command.Parameters.AddWithValue("@TuesdayStart", hours[2]);
                    command.Parameters.AddWithValue("@TuesdayEnd", hours[3]);

                    command.Parameters.AddWithValue("@WednesdayStart", hours[4]);
                    command.Parameters.AddWithValue("@WednesdayEnd", hours[5]);

                    command.Parameters.AddWithValue("@ThursdayStart", hours[6]);
                    command.Parameters.AddWithValue("@ThursdayEnd", hours[7]);

                    command.Parameters.AddWithValue("@FridayStart", hours[8]);
                    command.Parameters.AddWithValue("@FridayEnd", hours[9]);

                    command.Parameters.AddWithValue("@SaturdayStart", hours[10]);
                    command.Parameters.AddWithValue("@SaturdayEnd", hours[11]);

                    command.Parameters.AddWithValue("@SundayStart", hours[12]);
                    command.Parameters.AddWithValue("@SundayEnd", hours[13]);

                    command.Parameters.AddWithValue("@Employee_ID", employeeId);

                    command.ExecuteNonQuery();
                }
                RecountLeaveDays(form, employeeId);
            }
            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();
        }
        /// <summary>
        /// Metoda edytująca wpis urlopowy.
        /// </summary>
        /// <param name="form">Formularz potrzebujący metody.</param>
        /// <param name="leave">Obiekt urlopu wpisany w miejsce starego wpisu.</param>
        /// <param name="editedLeaveId">Numer id edytowanego wpisu urlopowego.</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>
        /// <exception cref="ArgumentException">Występuje w przypadku próby wzięcia pracownikowi większej liczby dni, niż posiada.</exception> 
        private static void EditLeave(LeaveManagerForm form, Leave leave)
        {
            /* 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
            {
                //Zczytanie podmienianego urlopu.
                Leave oldLeave = GetLeave(form, leave.Id);
                //Jeżeli wpisywany urlop konsumuje dni urlopowe.
                if (ConsumesDays(form, leave.LeaveType))
                {
                    leave.UsedDays = GetNumberOfWorkDays(form, leave.FirstDay, leave.LastDay, leave.EmployeeId);
                    //Obliczenie różnicy o którą trzeba zmienić liczbę dni urlopowych pracownika.
                    int difference = oldLeave.UsedDays - leave.UsedDays;
                    AddLeaveDays(form, leave.EmployeeId, difference);
                }
                else//Nowy urlop nie konsumuje dni.
                {
                    leave.UsedDays = 0;
                    //Jeżeli stary urlop konsumuje dni.
                    if (ConsumesDays(form, oldLeave.LeaveType))
                        //Dodajemy pracownikowi tyle dni, ile stary urlop konsumował.
                        AddLeaveDays(form, leave.EmployeeId, oldLeave.UsedDays);
                }
                //Polecenie sql aktualizujące wszystkie dane w starym wpisie.
                SqlCommand commandUpdate = new SqlCommand("UPDATE Leave SET LT_ID = (SELECT LT_ID FROM Leave_type WHERE Name = @Leave_type_name), LS_ID = " +
                   "(SELECT ST_ID FROM Status_type WHERE Name = @Status_name), " +
                   "First_day = @First_day, Last_day = @Last_day, Remarks = @Remarks, Used_days = @Used_days " +
                   "WHERE Leave_ID = @OldLeave_ID", form.Connection, form.Transaction);
                commandUpdate.Parameters.Add("@OldLeave_ID", SqlDbType.Int).Value = leave.Id;
                //Jeżeli wpisywany urlop jest chorobowym, to niezależnie od ustawionego stanu jest ustawiony stan zatwierdzony.
                if (leave.LeaveStatus.Equals("Sick"))
                {
                    commandUpdate.Parameters.Add("@Status_name", SqlDbType.VarChar).Value = "Approved";
                }
                else
                {
                    if (leave.LeaveStatus.Equals("Extraordinary"))
                    {
                    }
                    else
                    {
                        commandUpdate.Parameters.Add("@Status_name", SqlDbType.VarChar).Value = leave.LeaveStatus;
                    }
                }
                commandUpdate.Parameters.Add("@Employee_ID", SqlDbType.Int).Value = leave.EmployeeId;
                commandUpdate.Parameters.Add("@Leave_type_name", SqlDbType.VarChar).Value = leave.LeaveType;
                commandUpdate.Parameters.Add("@First_day", SqlDbType.Date).Value = leave.FirstDay;
                commandUpdate.Parameters.Add("@Last_day", SqlDbType.Date).Value = leave.LastDay;
                commandUpdate.Parameters.Add("@Remarks", SqlDbType.VarChar).Value = leave.Remarks;
                commandUpdate.Parameters.Add("@Used_days", SqlDbType.Int).Value = leave.UsedDays;
                commandUpdate.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();
        }
        /// <summary>
        /// Metoda służąca do odrzucania zgłoszeń urlopowych.
        /// </summary>
        /// <param name="form">Formularz wywołujący.</param>
        /// <param name="rejectedLeaveId">Numer id odrzucanego 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 RejectLeave(LeaveManagerForm form, int rejectedLeaveId)
        {
            /* 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
            {
                Leave rejectedLeave = GetLeave(form, rejectedLeaveId);
                //Polecenie sql służące do aktualizacji stanu zgłoszenia.
                SqlCommand command = new SqlCommand("UPDATE Leave SET LS_ID = (SELECT ST_ID FROM " +
                    "Status_type WHERE Name = @Name), Used_days = @Used_days WHERE Leave_ID = @Leave_ID", form.Connection,
                    form.Transaction);
                command.Parameters.Add("@Used_days", SqlDbType.Int).Value = 0;
                command.Parameters.Add("@Leave_ID", SqlDbType.Int).Value = rejectedLeave.Id;
                command.Parameters.Add("@Name", SqlDbType.VarChar).Value = "Rejected";
                command.ExecuteNonQuery();
                AddLeaveDays(form, rejectedLeave.EmployeeId, rejectedLeave.UsedDays);
            }
            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();
        }
        /// <summary>
        /// Metoda służąca do usunięcia z bazy danych typu pozycji pracowników.
        /// </summary>
        /// <param name="form">Formularz wywołujący metodę.</param>
        /// <param name="replacementPosition">Pozycja, która zostanie przypisana wszystkim pracownikom, którzy zajmują pozycję usuwaną.</param>
        /// <param name="deletedPosition">Nazwa pozycji usuwanej.</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>
        /// <exception cref="ArgumentOutOfRangeException">Występuje w przypadku, gdy w bazie nie istnieje replacementPosition.</exception>
        private static void DeletePosition(LeaveManagerForm form, string replacementPosition, string deletedPosition)
        {
            /* 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
            {
                //Zapytanie sql zczytujące id pozycji, która ma zastąpić miejsce usuwanej.
                SqlCommand commandCheckReplacedPosition = new SqlCommand("SELECT Position_ID FROM " +
                    "Position WHERE Description = @Description", form.Connection, form.Transaction);
                commandCheckReplacedPosition.Parameters.Add("@Description", SqlDbType.VarChar).Value = replacementPosition;
                SqlDataReader reader = commandCheckReplacedPosition.ExecuteReader();
                //Sprawdzenie, czy zastępująca pozycja istnieje.
                if (reader.Read())
                {
                    //Polecenie aktualizacji pozycji wszystkich pracowników, którzy zajmują pozycję usuwaną.
                    SqlCommand commandUpdate = new SqlCommand("UPDATE Employee SET Position_ID = " +
                        "@ReplacementPosition_ID " +
                        "WHERE Position_ID = " +
                        "(SELECT Position_ID FROM Position WHERE Description = @Description_replaced)", form.Connection, form.Transaction);
                    commandUpdate.Parameters.Add("@ReplacementPosition_ID", SqlDbType.Int).Value = (int)reader["Position_ID"];
                    reader.Close();
                    commandUpdate.Parameters.Add("@Description_replaced", SqlDbType.VarChar).Value = deletedPosition;
                    commandUpdate.ExecuteNonQuery();
                    //Polecenie usunięcia rodzaju pozycji przeznaczonego do usunięcia.
                    SqlCommand commandDelete = new SqlCommand("DELETE FROM Position WHERE " +
                        "Description = @Description", form.Connection, form.Transaction);
                    commandDelete.Parameters.Add("@Description", SqlDbType.VarChar).Value = deletedPosition;
                    commandDelete.ExecuteNonQuery();
                }
                else
                {
                    reader.Close();
                    throw new ArgumentOutOfRangeException();
                }
            }
            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();
        }
        /// <summary>
        /// Metoda usuwania daty z tabeli dni wolnych od pracy.
        /// </summary>
        /// <param name="form">Formularz wywołujący</param>
        /// <param name="date">Usuwana data.</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 DeletePublicHoliday(LeaveManagerForm form, DateTime date)
        {
            /* 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
            {
                using (SqlCommand command = new SqlCommand("DELETE FROM Public_holidays WHERE Date = @Date", form.Connection))
                {
                    if (form.TransactionOn)
                    {
                        command.Transaction = form.Transaction;
                    }
                    command.Parameters.AddWithValue("@Date", date);
                    command.ExecuteNonQuery();
                }

                DataTable employees = GetEmployees(form);
                for (int i = 0; i < employees.Rows.Count; ++i)
                {
                    RecountLeaveDays(form, (int)employees.Rows[i].ItemArray.GetValue(0));
                }
            }
            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();
        }
        /// <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="replacementType">Nazwa typu urlopu, który będzie wpisany jako typ urlopów, które są typu usuwanego.</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>
        /// <exception cref="ArgumentOutOfRangeException">Występuje w przypadku, gdy w bazie nie istnieje replacementType.</exception>
        private static void DeleteLeaveType(LeaveManagerForm form, string replacementType, string 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
            {
                //Zapytanie sql zczytujące id typu, który ma zastąpić usuwany typ.
                SqlCommand commandCheckReplaceType = new SqlCommand("SELECT LT_ID FROM Leave_type WHERE Name = @Name",
                    form.Connection, form.Transaction);
                commandCheckReplaceType.Parameters.Add("@Name", SqlDbType.VarChar).Value = replacementType;
                SqlDataReader reader = commandCheckReplaceType.ExecuteReader();
                if (reader.Read())//Sprawdzenie, czy typ, na który zamieniamy typ usuwany w ogóle istnieje.
                {
                    //Polecenie sql aktualizujące typy wszystkich urlopów, które są usuwanego typu.
                    SqlCommand commandUpdate = new SqlCommand("UPDATE Leave SET LT_ID = " +
                        "@ReplacementLT_ID " +
                        "WHERE LT_ID = " +
                        "(SELECT LT_ID FROM Leave_type WHERE Name = @Name_replaced)", form.Connection, form.Transaction);
                    commandUpdate.Parameters.Add("@ReplacementLT_ID", SqlDbType.Int).Value = (int)reader["LT_ID"];
                    reader.Close();
                    commandUpdate.Parameters.Add("@Name_replaced", SqlDbType.VarChar).Value = deletedType;
                    commandUpdate.ExecuteNonQuery();
                    //Polecenie sql usuwające typ do usunięcia.
                    SqlCommand commandDelete = new SqlCommand("DELETE FROM Leave_type WHERE " +
                        "Name = @Name", form.Connection, form.Transaction);
                    commandDelete.Parameters.Add("@Name", SqlDbType.VarChar).Value = deletedType;
                    commandDelete.ExecuteNonQuery();
                }
                else
                {
                    reader.Close();
                    throw new ArgumentOutOfRangeException();
                }
            }
            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();
        }
        /// <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();
        }
        /// <summary>
        /// Dodanie chorobowego.
        /// </summary>
        /// <param name="form">Formularz potrzebujący metody.</param>
        /// <param name="leave">Obiekt reprezentujący dodawany urlop.</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 AddSickLeave(LeaveManagerForm form, Leave leave)
        {
            /* 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
            {
                //Zczytanie urlopów pracownika, któremu dodajemy chorobowe.
                /// Kolumny tabeli: "Leave Id", "Status", "First day", "Last day", "Type",
                /// "Remarks", "No. used days"
                DataTable dataLeaves = GetLeaves(form, leave.EmployeeId);

                /* Zmienna w której będzie przechowywana liczba dni do zwrócenia pracownikowi.
                 * Powiększa się w przypadku, gdy chorobowe zachodzi na jakiś urlop.
                 */
                int returnedLeaveDays = 0;
                int returnedDemandedDays = 0;
                //Dla każdego istniejącego w bazie urlopu.
                foreach (DataRow row in dataLeaves.Rows)
                {
                    //Pierwszy dzień sprawdzanego urlopu jest później lub ten sam, co pierwszy dzień chorobowego
                    if ((((DateTime)row.ItemArray.GetValue(2)).CompareTo(leave.FirstDay) >= 0)
                        //i jest wcześniej lub taki sam jak ostatni dzień chorobowego.
                    && (((DateTime)row.ItemArray.GetValue(2)).CompareTo(leave.LastDay) <= 0))
                    {//Czyli w praktyce: Zaczyna się w trakcie chorobowego -> jest anulowany.
                        //Jeżeli zachodzący wpis to chorobowe.
                        if (row.ItemArray.GetValue(4).ToString().Equals("Sick"))
                            throw new EntryExistsException();
                        //Polecenie sql zmieniające stan zachodzącego urlopu na anulowany.
                        SqlCommand commandUpdateLeave = new SqlCommand("UPDATE Leave SET " +
                           "LS_ID = (SELECT ST_ID FROM Status_type WHERE Name = @Status_name), Used_days = @Used_days " +
                           "WHERE Leave_ID = @Leave_ID", form.Connection, form.Transaction);
                        commandUpdateLeave.Parameters.Add("@Status_name", SqlDbType.VarChar).Value = "Canceled";
                        commandUpdateLeave.Parameters.Add("@Leave_ID", SqlDbType.Int).Value = (int)row.ItemArray.GetValue(0);
                        commandUpdateLeave.Parameters.Add("@Used_days", SqlDbType.Int).Value = 0;
                        commandUpdateLeave.ExecuteNonQuery();
                        //Dodanie do liczby dni do zwrócenia pracownikowi dni anulowanego urlopu.
                        returnedLeaveDays += (int)row.ItemArray.GetValue(6);
                        if (row.ItemArray.GetValue(4).ToString().Equals("Extraordinary"))
                        {
                            returnedDemandedDays += (int)row.ItemArray.GetValue(6);
                        }
                        continue;
                    }

                    if ((leave.FirstDay.CompareTo((DateTime)row.ItemArray.GetValue(2)) >= 0)//Sick first day later than leave first day
                    && (leave.FirstDay.CompareTo((DateTime)row.ItemArray.GetValue(3)) <= 0))//and earlier than leave last day.
                    {//Czyli w praktyce: Kończy się w trakcie chorobowego -> jest 'przycinany' do ostatniego dnia przed chorobowym.
                        SqlCommand commandUpdateLeave = new SqlCommand("UPDATE Leave SET " +
                            "Last_day = @Last_day, Used_days = @Used_days WHERE Leave_ID = @Leave_ID", form.Connection, form.Transaction);
                        commandUpdateLeave.Parameters.Add("@Last_day", SqlDbType.Date).Value = leave.FirstDay.AddDays(-1);
                        commandUpdateLeave.Parameters.Add("@Leave_ID", SqlDbType.Int).Value = (int)row.ItemArray.GetValue(0);
                        //Nowa liczba użytych dni to liczba użytych dni pomiędzy pierwszym dniem zmienianego urlopu i pierwszym-1 dniem chorobowego.
                        commandUpdateLeave.Parameters.Add("@Used_days", SqlDbType.Int).Value =
                            GetNumberOfWorkDays(form, (DateTime)row.ItemArray.GetValue(2), leave.FirstDay.AddDays(-1), leave.EmployeeId);
                        commandUpdateLeave.ExecuteNonQuery();
                        int tmpReturnedDays = GetNumberOfWorkDays(form, leave.FirstDay.AddDays(-1), (DateTime)row.ItemArray.GetValue(1), leave.EmployeeId);
                        //Dodanie do liczby dni do zwrócenia pracownikowi liczby dni za okres od początku chorobowego do końca urlopu.
                        returnedLeaveDays += GetNumberOfWorkDays(form, leave.FirstDay.AddDays(-1), (DateTime)row.ItemArray.GetValue(1), leave.EmployeeId);
                        //Jeżeli urlop był na żądanie.
                        if (row.ItemArray.GetValue(4).ToString().Equals("Extraordinary"))
                        {
                            returnedDemandedDays += tmpReturnedDays;
                        }
                        continue;
                    }
                }
                //Zwrócenie pracownikowi dni.
                AddLeaveDays(form, leave.EmployeeId, returnedLeaveDays);
                AddDemandDays(form, leave.EmployeeId, -returnedDemandedDays);
                //Dodanie urlopu.
                AddLeave(form, leave);
            }
            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();
        }
        /// <summary>
        /// Metoda usuwania wpisu urlopowego.
        /// </summary>
        /// <param name="form">Formularz potrzebujący metody.</param>
        /// <param name="leaveId">Numer id usuwanego wpisu urlopowego.</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 DeleteLeave(LeaveManagerForm form, int leaveId)
        {
            /* 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
            {
                Leave leave = GetLeave(form, leaveId);
                //Polecenie sql usuwające wpis urlopowy.
                SqlCommand commandDeleteLeave = new SqlCommand("DELETE FROM Leave WHERE Leave_ID = @Leave_ID",
                    form.Connection, form.Transaction);
                commandDeleteLeave.Parameters.Add("@Leave_ID", SqlDbType.Int).Value = leave.Id;
                commandDeleteLeave.ExecuteNonQuery();
                AddLeaveDays(form, leave.EmployeeId, leave.UsedDays);
            }
            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();
        }
        /// <summary>
        /// Metoda dodająca nowy rodzaj pozycji (pracowników) do bazy.
        /// </summary>
        /// <param name="form">Formularz wywołujący metodę.</param>
        /// <param name="name">Nazwa nowej pozycji.</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>
        /// <exception cref="EntryExists">Występuje w przypadku próby dodania istniejącej pozycji.</exception>
        private static void AddPositionType(LeaveManagerForm form, string name)
        {
            /* 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
            {
                //Sprawdzenie, czy dana pozycja już istnieje.
                SqlCommand commandCheckIfExists = new SqlCommand("SELECT Position_ID " +
                    "FROM Position WHERE Description = @Description", form.Connection, form.Transaction);
                commandCheckIfExists.Parameters.Add("@Description", SqlDbType.VarChar).Value = name;
                SqlDataReader reader = commandCheckIfExists.ExecuteReader();
                if (reader.Read())//Jeżeli dana pozycja już istnieje to rzuć wyjątek.
                {
                    reader.Close();
                    throw new EntryExistsException();
                }
                reader.Close();
                SqlCommand command = new SqlCommand("INSERT INTO Position " +
                    "VALUES((SELECT MAX(Position_ID) + 1 FROM Position), @Name)", form.Connection, form.Transaction);
                command.Parameters.Add("@Name", SqlDbType.VarChar).Value = name;
                command.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();
        }
        /// <summary>
        /// Metoda służąca do "dawania" pracownikowi dodatkowych dni urlopowych. Dodaje je najpierw do 
        /// normalnych dni urlopowych, a gdy ich liczba == liczba dni/rok, dodaje resztę dni do zaległych dni urlopowych.
        /// Możliwe jest odejmowanie dni urlopowych za pomocą tej metody. Aby to uczynić należy podać ujemną wartość do 
        /// argumentu number.
        /// </summary>
        /// <param name="form">Formularz wywołujący</param>
        /// <param name="employeeId">Numer id pracownika, któremu mają zostać dodane dni.</param>
        /// <param name="number">Liczba dodawanych dni. Może być ujemna.</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>
        /// <exception cref="ArgumentException">Występuje w przypadku próby odjęcia większej liczby dni, niż pracownik posiada.</exception>
        private static void AddLeaveDays(LeaveManagerForm form, int employeeId, int number)
        {
            /* 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
            {
                /* Zmienne do których zczytane zostaną wartości odpowiednio liczby dni urlopowych,
                 * zaległych dni urlopowych oraz dni urlopowych przypadających na rok.
                 */
                int leaveDays = 0, oldLeaveDays = 0, yearDays = 0;
                /* Zczytanie aktualnych wartości do zmiennych dni. Dane te muszą być aktualne, aby
                 * nie było ryzyka, obliczamy i wpisujemy do bazy liczbę dni na podstawie danych
                 * nie aktualnych.
                 */
                GetDays(form, employeeId, ref leaveDays, ref oldLeaveDays, ref yearDays);
                //Polecenie sql aktualizujące liczbę dni danego pracownika.
                SqlCommand commandUpdateEmployee = new SqlCommand("UPDATE Employee SET " +
                    "Leave_days = @Leave_days, Old_leave_days = @Old_leave_days " +
                    "WHERE Employee_ID = @Employee_ID", form.Connection, form.Transaction);
                //Obliczenie wartości dla poszczególnych pól w bazie.
                //Jeżeli dodajemy dni.
                if (number > 0)
                {
                    //Jeżeli trzeba dodać dni zaległe.
                    if (leaveDays + number > yearDays)
                    {
                        commandUpdateEmployee.Parameters.Add("@Leave_days", SqlDbType.Int).Value = yearDays;
                        commandUpdateEmployee.Parameters.Add("@Old_leave_days", SqlDbType.Int).Value =
                            oldLeaveDays + number - (yearDays - leaveDays);
                    }
                    else
                    {
                        commandUpdateEmployee.Parameters.Add("@Leave_days", SqlDbType.Int).Value = leaveDays + number;
                        commandUpdateEmployee.Parameters.Add("@Old_leave_days", SqlDbType.Int).Value = 0;
                    }
                }
                else//Jeżeli odejmujemy dni.
                {
                    //Jeżeli odejmujemy więcej niż jest.
                    if (number + leaveDays + oldLeaveDays < 0)
                        throw new ArgumentException();
                    else
                    {
                        //Jeżeli liczba odejmowanych dni jest <= liczbie zaległych dni.
                        if (number + oldLeaveDays >= 0)
                        {
                            commandUpdateEmployee.Parameters.Add("@Leave_days", SqlDbType.Int).Value = leaveDays;
                            commandUpdateEmployee.Parameters.Add("@Old_leave_days", SqlDbType.Int).Value = number + oldLeaveDays;
                        }
                        else
                        {
                            commandUpdateEmployee.Parameters.Add("@Leave_days", SqlDbType.Int).Value = number + leaveDays + oldLeaveDays;
                            commandUpdateEmployee.Parameters.Add("@Old_leave_days", SqlDbType.Int).Value = 0;
                        }
                    }
                }
                commandUpdateEmployee.Parameters.Add("@Employee_ID", SqlDbType.Int).Value = employeeId;
                commandUpdateEmployee.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();
        }
        /// <summary>
        /// Metoda dodawania zgłoszenia urlopowego.
        /// </summary>
        /// <param name="form">Formularz potrzebujący metody.</param>
        /// <param name="leave">Obiekt reprezentujący nowy wpis urlopowy.</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>
        /// <exception cref="ArgumentException">Występuje w przypadku próby odjęcia większej liczby dni, niż pracownik posiada.</exception>
        private static void AddLeave(LeaveManagerForm form, Leave leave)
        {
            /* 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
            {
                //Liczba zużytych przez urlop dni.
                int usedDays;
                //Jeżeli urlop konsumuje dni.
                if (ConsumesDays(form, leave.LeaveType))
                {
                    usedDays = GetNumberOfWorkDays(form, leave.FirstDay, leave.LastDay, leave.EmployeeId);
                    //Odejmujemy pracownikowi dni za dany urlop.
                    AddLeaveDays(form, leave.EmployeeId, -usedDays);
                }
                else
                {
                    usedDays = 0;
                }
                //Polecenie sql Zczytujące największy nr id + 1
                SqlCommand commandGetNewId = new SqlCommand("(SELECT MAX(Leave_ID) + 1 FROM Leave)", form.Connection, form.Transaction);
                int newLeaveId;
                try
                {
                    newLeaveId = (int)commandGetNewId.ExecuteScalar();
                }
                catch
                {
                    //Jeżeli nie udało się zczytać id, to możliwe, że żaden wpis w bazie nie istnieje. Wtedy przypisujemy id = 0
                    newLeaveId = 0;
                }

                //Polecenie sql dodające nowy wpis urlopowy.
                SqlCommand commandInsertLeave = new SqlCommand("INSERT INTO Leave VALUES (@Leave_ID, @Employee_ID, " +
                     "(SELECT LT_ID FROM Leave_type WHERE Name = @Leave_type_name), (SELECT ST_ID FROM Status_type WHERE Name = @Status_name), " +
                     "@First_day, @Last_day, @Remarks, @Used_days)", form.Connection, form.Transaction);
                //Jeżeli wpis to chorobowe, to automatycznie otrzymuje stan zatwierdzony.
                if (leave.LeaveType.Equals("Sick"))
                {
                    commandInsertLeave.Parameters.Add("@Status_name", SqlDbType.VarChar).Value = "Approved";
                }
                else
                {
                    //Jeżeli jest to urlop na żądanie, to automatycznie otrzymuje stan zatwierdzony.
                    if (leave.LeaveType.Equals("Extraordinary"))
                    {
                        commandInsertLeave.Parameters.Add("@Status_name", SqlDbType.VarChar).Value = "Approved";
                        //Zaktualizowanie stanu liczby dostępnych dni na żądanie.
                        AddDemandDays(form, leave.EmployeeId, usedDays);
                    }
                    else
                    {
                        commandInsertLeave.Parameters.Add("@Status_name", SqlDbType.VarChar).Value = leave.LeaveStatus;
                    }
                }
                commandInsertLeave.Parameters.Add("@Leave_ID", SqlDbType.Int).Value = newLeaveId;
                commandInsertLeave.Parameters.Add("@Employee_ID", SqlDbType.Int).Value = leave.EmployeeId;
                commandInsertLeave.Parameters.Add("@Leave_type_name", SqlDbType.VarChar).Value = leave.LeaveType;
                commandInsertLeave.Parameters.Add("@First_day", SqlDbType.Date).Value = leave.FirstDay;
                commandInsertLeave.Parameters.Add("@Last_day", SqlDbType.Date).Value = leave.LastDay;
                commandInsertLeave.Parameters.Add("@Remarks", SqlDbType.VarChar).Value = leave.Remarks;
                commandInsertLeave.Parameters.Add("@Used_days", SqlDbType.Int).Value = usedDays;
                commandInsertLeave.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();
        }
        /// <summary>
        /// Metoda dodawania nowego pracownika.
        /// </summary>
        /// <param name="form">Formularz wywołujący.</param>
        /// <param name="employee">Obiekt zawierający dane dodawanego pracownika.</param>
        /// <remarks>Jeżeli formularz ma uruchomioną transakcję,to poziom jej izolacji
        /// musi być == ReapeatableRead lub Serializable.
        /// 
        /// Nowy pracownik będzie posiadał losowo wygenerowane login i hasło składające się z cyfr.</remarks>
        /// <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>
        /// <exception cref="NoFreeLoginException">Wyjątek występuje, gdy wszystkie z możliwych do wylosowania loginów są zajęte.</exception>
        private static void AddEmployee(LeaveManagerForm form, Employee employee)
        {
            /* 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
            {
                //Obiekt umożliwiający losowanie.
                Random random = new Random();
                //Zmienna do której zostanie wygenerowany login.
                int login = 0;
                /* Zapytanie sql służące do sprawdzenia, czy wygenerowany login już istnieje. Jeżeli zwróci wynik,
                 * to oznacza to, że podany login istnieje.
                 */
                SqlCommand commandCheckLogin = new SqlCommand("SELECT Login FROM Employee WHERE Login = @Login",
                    form.Connection, form.Transaction);
                //Stworzenie obiektu służącego do czytania wyników zapytania.
                SqlDataReader reader;
                //Pętla szukająca wolnego loginu składającego się z 7 cyfr.
                for (int i = 1000000; i <= 10000000; ++i)
                {
                    //Wylosowanie loginu.
                    login = random.Next(1000000, 10000000);
                    //Wyczyszczenie parametrów zapytania.
                    commandCheckLogin.Parameters.Clear();
                    //Dodanei nowego parametru zapytania: losowo wygenerowanego loginu.
                    commandCheckLogin.Parameters.Add("@Login", SqlDbType.VarChar).Value = login.ToString();
                    //Przypisanie wyników zapytania z nowym parametrem do obiektu czytającego.
                    reader = commandCheckLogin.ExecuteReader();
                    /* Jeżeli obiekt czytający nie ma czego czytać (=> zapytanie nic nie zwróciło =>
                     * wygenerowany login nie istnieje w bazie.
                     */
                    if (!reader.Read())
                    {
                        //Zamykamy obiekt czytający i przerywamy pętle szukającą nie wykorzystanego loginu.
                        reader.Close();
                        reader.Dispose();
                        break;
                    }
                    reader.Close();
                    //Jeżeli szukanie wolnego loginu zakończyło się niepowodzeniem.
                    if (i == 10000000)
                        throw new NoFreeLoginException();
                }
                //Wygenerowanie 7 znakowego hasła składającego się z samych cyfr.
                int password = random.Next(1000000, 10000000);
                //Polecenie sql dodające wpis nowego pracownika. Nadaje mu id o 1 większe od największego numeru id w bazie.
                SqlCommand commandInsertEmployee = new SqlCommand("INSERT INTO Employee (Employee_ID, Permission_ID, Position_ID, " +
                  "Login, Password, Name, Surname, Birth_date, Address, PESEL, EMail, " +
                  "Year_leave_days, Leave_days, Old_leave_days) VALUES ((SELECT MAX(Employee_ID) + 1 FROM Employee)," +
                  "(SELECT Permission_ID FROM Permission WHERE Description = @Permission_Description), " +
                  "(SELECT Position_ID FROM Position WHERE Description = @Position_Description), " +
                  "@Login, @Password, @Name, @Surname, @Birth_date, @Address," +
                  "@PESEL, @EMail, @Year_leave_days, @Leave_days, 0)", form.Connection, form.Transaction);
                //Ustawienie parametrów polecenia.
                commandInsertEmployee.Parameters.Add("@Permission_Description", SqlDbType.VarChar).Value = employee.Permission;
                commandInsertEmployee.Parameters.Add("@Position_Description", SqlDbType.VarChar).Value = employee.Position;
                commandInsertEmployee.Parameters.Add("@Login", SqlDbType.VarChar).Value = login.ToString();
                commandInsertEmployee.Parameters.Add("@Password", SqlDbType.VarChar).Value = StringSha.GetSha256Managed(password.ToString());
                commandInsertEmployee.Parameters.Add("@Name", SqlDbType.VarChar).Value = employee.Name;
                commandInsertEmployee.Parameters.Add("@Surname", SqlDbType.VarChar).Value = employee.Surname;
                commandInsertEmployee.Parameters.Add("@Birth_date", SqlDbType.DateTime).Value = employee.BirthDate;
                commandInsertEmployee.Parameters.Add("@Address", SqlDbType.VarChar).Value = employee.Address;
                commandInsertEmployee.Parameters.Add("@PESEL", SqlDbType.VarChar).Value = employee.Pesel;
                commandInsertEmployee.Parameters.Add("@EMail", SqlDbType.VarChar).Value = employee.EMail;
                commandInsertEmployee.Parameters.Add("@Year_leave_days", SqlDbType.Int).Value = employee.YearLeaveDays;
                commandInsertEmployee.Parameters.Add("@Leave_days", SqlDbType.Int).Value = employee.LeaveDays;
                commandInsertEmployee.ExecuteNonQuery();
                /* Polecenie sql odpowiedzialne za wpisanie nowego pracownika do tablicy pracowników nie poinformowanych
                 * o swoim loginie i hasle.
                 */
                SqlCommand commandInsertUninformed = new SqlCommand("INSERT INTO Uninformed (Employee_ID, Password) " +
                    "VALUES ((SELECT MAX(Employee_ID) FROM Employee), @Password)", form.Connection, form.Transaction);
                commandInsertUninformed.Parameters.Add("@Password", SqlDbType.VarChar).Value = password.ToString();
                commandInsertUninformed.ExecuteNonQuery();
                /* Polecenie sql odpowiedzialne za dodanie pustego wpisu do tablicy z harmonogramem pracy*/
                SqlCommand commandInsertWorkHours = new SqlCommand("INSERT INTO Work_hours (Employee_ID) VALUES ((SELECT MAX(Employee_ID) FROM Employee))", form.Connection, form.Transaction);
                commandInsertWorkHours.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();
        }
        /// <summary>
        /// Metoda dodawania/odejmowania dni zażądanych.
        /// </summary>
        /// <param name="form">Formularz potrzebujący metody.</param>
        /// <param name="employeeId">Numer id pracownika, któremu dodane/odjęte zostaną dni zażądane.</param>
        /// <param name="number">Liczba dni do dodania (ujemna, gdy chcemy odjąć).</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>
        /// <exception cref="ArgumentException">Występuje w przypadku, gdy liczba dodawanych dni jest ujemna
        /// a wynikiem ich dodania byłaby liczba mniejsza od 0.</exception>
        /// <exception cref="OverflowException">Występuje w przypadku, gdy dodanie dni spowodowałoby przekroczenie
        /// wartości 4.</exception>
        private static void AddDemandDays(LeaveManagerForm form, int employeeId, int number)
        {
            /* 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
            {
                int demandedDays = GetDemadedDays(form, employeeId);

                if (demandedDays + number <= 4)
                {
                    if (demandedDays + number >= 0)
                    {
                        SqlCommand command = new SqlCommand("UPDATE Employee SET Demand_days = @Demand_days " +
                            "WHERE Employee_ID = @Employee_ID", form.Connection, form.Transaction);
                        command.Parameters.AddWithValue("@Demand_days", demandedDays + number);
                        command.Parameters.AddWithValue("@Employee_ID", employeeId);
                        command.ExecuteNonQuery();
                    }
                    else
                    {
                        throw new ArgumentException("Operation could not be performed because result would be lower than 0.");
                    }
                }
                else
                {
                    throw new OverflowException("Argument number + number of already demanded days is grater than 4.");
                }

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