/// <summary> /// Konstruktor. /// </summary> /// <param name="connection">Połączenie z bazą danych. Powinno być otwarte.</param> /// <param name="employee"></param> public FormEmployee(SqlConnection connection, Employee employee) { InitializeComponent(); this.connection = connection; this.employee = employee; labelNameValue.Text = employee.Name + " " + employee.Surname; labelPositionValue.Text = employee.Position; RefreshData(); }
public FormAddOrEditEmployee(SqlConnection connection, int employeeId) { InitializeComponent(); this.connection = connection; try { employeeToEdit = this.GetEmployee(employeeId); } catch (SqlException) { MessageBox.Show("SQL Error. This form will be close. Please try again later."); this.Close(); } catch (InvalidOperationException) { MessageBox.Show("Invalid operation. This form will be close. Please try again later"); this.Close(); } catch (EmployeeIdException) { MessageBox.Show("EmployeeID not found in database. This form will be close. Please try again later"); this.Close(); } catch (Exception ex) { MessageBox.Show("Unknown exception has occured" + ex.Message); this.Close(); } //przystosowanie odpowiednich elementów okna tak aby pasowały do funkcji związanych z edycją pracownika labelInfo.Text = "Here you can edit information about " + employeeToEdit.Name + " " + employeeToEdit.Surname; buttonAdd.Text = "Edit employee"; //Ustawienie ograniczeń dla daty urodzenia nowego pracownika. dateTimePickerBirthDate.MinDate = (DateTime.Today.AddYears(-100)); dateTimePickerBirthDate.MaxDate = (DateTime.Today.AddYears(-16)); dateTimePickerBirthDate.Value = (DateTime.Today.AddYears(-20)); //Zczytanie listy możliwych do ustawienia uprawnień oraz pozycji pracownika. comboBoxPermissions.DataSource = this.GetPermissions(); comboBoxPossition.DataSource = this.GetPositionsList(); comboBoxPermissions.SelectedItem = employeeToEdit.Permission; textBoxName.Text = employeeToEdit.Name; textBoxSurname.Text = employeeToEdit.Surname; textBoxAddress.Text = employeeToEdit.Address; textBoxPesel.Text = employeeToEdit.Pesel; textBoxEMail.Text = employeeToEdit.EMail; textBoxNumberOfLeaveDays.Text = employeeToEdit.LeaveDays.ToString(); comboBoxPossition.SelectedItem = employeeToEdit.Position; }
/// <summary> /// Konstruktor. /// </summary> /// <param name="connection">Połączenie do bazy danych. Powinno być otwarte.</param> public FormAddOrEditEmployee(SqlConnection connection) { InitializeComponent(); employeeToEdit = null; this.connection = connection; //Ustawienie ograniczeń dla daty urodzenia nowego pracownika. dateTimePickerBirthDate.MinDate = (DateTime.Today.AddYears(-100)); dateTimePickerBirthDate.MaxDate = (DateTime.Today.AddYears(-16)); dateTimePickerBirthDate.Value = (DateTime.Today.AddYears(-20)); //Zczytanie listy możliwych do ustawienia uprawnień oraz pozycji pracownika. try { comboBoxPermissions.DataSource = this.GetPermissions(); comboBoxPossition.DataSource = this.GetPositionsList(); } catch (SqlException) { MessageBox.Show("SQL Error. This form will be close. Please try again later."); this.Close(); } catch (InvalidOperationException) { MessageBox.Show("Invalid operation. This form will be close. Please try again later"); this.Close(); } catch (Exception ex) { MessageBox.Show("Unknown exception has occured" + ex.Message); this.Close(); } //todo usunąć dane wspomagające testy poniżej textBoxName.Text = "trol"; textBoxSurname.Text = "trol"; textBoxAddress.Text = "jaskinia"; textBoxPesel.Text = "99999999999"; textBoxEMail.Text = "asdf"; textBoxNumberOfLeaveDays.Text = "22"; }
/// <summary> /// Metoda wywoływana w przypadku naciśnięcia guzika logowania. /// </summary> /// <param name="sender">Obiekt wysyłający.</param> /// <param name="e">Argumenty.</param> private void buttonLogin_Click(object sender, EventArgs e) { try { //Próba zalogowania employee = this.Login(textBoxLogin.Text, textBoxPassword.Text); //Jeżeli próba zalogowania powiodła się to ustawiamy flagę zalogowania. loggedIn = true; this.Close(); } catch (SqlException) { MessageBox.Show("SQL error. Please try connection to database or try again later"); } catch (InvalidOperationException) { MessageBox.Show("Invalid operation. Please try again later."); } catch (LoginOrPasswordException) { MessageBox.Show("Incorrect login or password. Please try again later."); } catch (Exception ex) { MessageBox.Show("Unknown exception has occured" + ex.Message); } }
/// <summary> /// Metoda dodawania nowego pracownika. /// Rozszerza formularz dodawania pracownika. /// </summary> /// <param name="form">Formularz wywołujący.</param> /// <param name="employee">Obiekt zawierający dane dodawanego pracownika.</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="NoFreeLoginException">Wyjątek występuje, gdy wszystkie z możliwych do wylosowania loginów są zajęte.</exception> public static void AddEmployee(this FormAddOrEditEmployee form, Employee employee) { AddEmployee((LeaveManagerForm)form, employee); }
/// <summary> /// Metoda logowania. /// </summary> /// <param name="form">Formularz wywołujący.</param> /// <param name="login">Login.</param> /// <param name="password">Hasło.</param> /// <returns>Zwraca obiekt reprezentujący zalogowanego pracownika.</returns> /// <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="LoginOrPasswordException">Login or password is wrong.</exception> private static Employee Login(LeaveManagerForm form, String login, String password) { //Zapytanie sql zczytujące dane pracownika o podanym loginie i haśle. SqlCommand command = new SqlCommand("SELECT E.Employee_ID, Perm.Description AS Permission, E.Name, E.Surname, E.Birth_date," + "E.Address, E.PESEL, E.EMail, Pos.Description AS Position, E.Year_leave_days, " + "E.Leave_days, E.Old_leave_days, E.Demand_days " + "FROM Employee E, Permission Perm, Position Pos WHERE Login = @Login AND " + "Password = @Password AND E.Permission_ID = Perm.Permission_ID AND " + "E.Position_ID = Pos.Position_ID", form.Connection); //Dodanie parametru loginu. command.Parameters.Add("@Login", SqlDbType.VarChar).Value = login; //Dodanie parametru hasła. Hasła są przechowywane w bazie w formie skrótu, stąd parametr to skrót hasła. command.Parameters.Add("@Password", SqlDbType.VarChar).Value = StringSha.GetSha256Managed(password); //Jeżeli formularz ma włączoną transakcję. if (form.TransactionOn) //Przypisanie do zapytania transakcji formularza. command.Transaction = form.Transaction; //Stworzenie obiektu czytającego wyniki zapytania. SqlDataReader reader = command.ExecuteReader(); //Jeżeli wyniki zapytania są nie puste. if (reader.Read()) { //Stworzenie nowego obiektu pracownika z danymi zczytanymi za pomocą zapytania. Employee employee = new Employee((int)reader["Employee_ID"], reader["Permission"].ToString(), reader["Name"].ToString(), reader["Surname"].ToString(), (DateTime)reader["Birth_date"], reader["Address"].ToString(), reader["PESEL"].ToString(), reader["EMail"].ToString(), reader["Position"].ToString(), (int)reader["Year_leave_days"], (int)reader["Leave_days"], (int)reader["Old_leave_days"], (int)reader["Demand_days"]); //Zamknięcie obiektu czytającego. reader.Close(); //Zwrócenie wyniku. return employee; } else//Nie znaleziono żadnego pracownika o podanym loginie i hasle. { //Zamknięcie obiektu czytającego. reader.Close(); throw new LoginOrPasswordException(); } }
/// <summary> /// Metoda służy do edycji danych pracownika. Rozszerza formularz dodawania lub edycji pracownika. /// </summary> /// <param name="form">Formularz wywołujący metode</param> /// <param name="newEmployee">Nowe dane pracownika</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="PermissionException">"Bład podczas odczytywania uprawnień(uprawnienia nie została odnaleziona"</exception> /// <exception cref="PositionException">"Bład podczas odczytywania pozycji (pozycja nie została odnaleziona"</exception> public static void EditEmployee(this FormAddOrEditEmployee form, Employee newEmployee) { EditEmployee((LeaveManagerForm)form, newEmployee); }
/// <summary> /// Metoda zwracająca obiekt reprezentujący dane pracownika. /// </summary> /// <param name="form">Formularz wywołujący metodę.</param> /// <param name="employeeId">Numer id pobieranego pracownika.</param> /// <returns>Obiekt pracownika, którego numer id zgadza się z argumentem.</returns> /// <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="EmployeeIdException">"Pracownik o podanym Id nie istnieje"</exception> private static Employee GetEmployee(LeaveManagerForm form, int employeeId) { //Zapytanie sql czytające dane pracownika o danym numerze id. SqlCommand command = new SqlCommand("SELECT E.Employee_ID, Perm.Description AS Permission, E.Name, E.Surname, E.Birth_date," + "E.Address, E.PESEL, E.EMail, Pos.Description AS Position, E.Year_leave_days, " + "E.Leave_days, E.Old_leave_days, E.Demand_days " + "FROM Employee E, Permission Perm, Position Pos WHERE Employee_ID = @Employee_ID " + "AND E.Permission_ID = Perm.Permission_ID AND " + "E.Position_ID = Pos.Position_ID", form.Connection); //Jeżeli formularz ma uruchomioną transakcję, dodaj do niej zapytanie. if (form.TransactionOn) command.Transaction = form.Transaction; //Ustawienie parametru numeru id szukanego pracownika w zapytaniu. command.Parameters.Add("@Employee_ID", SqlDbType.Int).Value = employeeId; //Stworzenie obiektu czytającego wyniki zapytania. SqlDataReader reader = command.ExecuteReader(); //Jeżeli znaleziono wpis z danym numerem id. if (reader.Read()) { //Zczytanie danych z obiektu czytającego do nowego obiektu pracownika i zwrócenie go. Employee employee = new Employee(employeeId, reader["Permission"].ToString(), reader["Name"].ToString(), reader["Surname"].ToString(), (DateTime)reader["Birth_date"], reader["Address"].ToString(), reader["PESEL"].ToString(), reader["EMail"].ToString(), reader["Position"].ToString(), (int)reader["Year_leave_days"], (int)reader["Leave_days"], (int)reader["Old_leave_days"], (int)reader["Demand_days"]); reader.Close(); return employee; } else { reader.Close(); throw new EmployeeIdException(); } }
/// <summary> /// Metoda służy do edycji danych pracownika /// </summary> /// <param name="form">Formularz wywołujący metode</param> /// <param name="newEmployee">Nowe dane pracownika</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="PermissionException">"Bład podczas odczytywania uprawnień(uprawnienia nie została odnaleziona"</exception> /// <exception cref="PositionException">"Bład podczas odczytywania pozycji (pozycja nie została odnaleziona"</exception> private static void EditEmployee(LeaveManagerForm form, Employee newEmployee) { //Zapytanie SQL edytujące danego pracownika SqlCommand command = new SqlCommand("UPDATE Employee SET Permission_ID = @Permission, Position_ID = @Position" + ", Name = @Name, Surname = @Surname, Birth_date = @Birth_date, Address = @Address, Pesel = @Pesel" + ", EMail = @Email, Year_leave_days = @Year_leave_days WHERE Employee_ID = @Employee_ID", form.Connection); //Ustawienie parametrów zapytania command.Parameters.Add("@Permission", SqlDbType.Int).Value = GetPermissionID(form, newEmployee.Permission); command.Parameters.Add("@Position", SqlDbType.Int).Value = GetPositionID(form, newEmployee.Position); command.Parameters.Add("@Name", SqlDbType.VarChar).Value = newEmployee.Name; command.Parameters.Add("@Surname", SqlDbType.VarChar).Value = newEmployee.Surname; command.Parameters.Add("@Birth_date", SqlDbType.Date).Value = newEmployee.BirthDate; command.Parameters.Add("@Address", SqlDbType.VarChar).Value = newEmployee.Address; command.Parameters.Add("@Pesel", SqlDbType.VarChar).Value = newEmployee.Pesel; command.Parameters.Add("@Email", SqlDbType.VarChar).Value = newEmployee.EMail; command.Parameters.Add("@Year_leave_days", SqlDbType.Int).Value = newEmployee.YearLeaveDays; command.Parameters.Add("@Employee_ID", SqlDbType.Int).Value = newEmployee.EmployeeId; if (form.TransactionOn) //Przypisanie do zapytania transakcji formularza. command.Transaction = form.Transaction; command.ExecuteNonQuery(); }
/// <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(); }