| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- using Npgsql;
- using System;
- using System.Data;
- using System.Windows;
- using System.Windows.Controls;
- namespace WpfApp1
- {
- public partial class DriversWindow : Window
- {
- private const string Conn = "Host=80.250.189.52;Port=5432;Database=dbwork;Username=kotov_aa;Password=0$s%MB3&F6#";
- public DriversWindow()
- {
- InitializeComponent();
- ApplyPermissions();
- LoadDrivers();
- }
- private void ApplyPermissions()
- {
- string role = AppSession.Role;
- bool canEdit = role == "admin" || role == "dispatcher";
- bool canDelete = role == "admin";
- // Безопасный перебор кнопок
- var grid = Content as Grid;
- if (grid == null || grid.Children.Count < 3) return;
- var panel = grid.Children[2] as StackPanel;
- if (panel == null) return;
- foreach (var child in panel.Children)
- {
- if (child is Button btn)
- {
- string content = btn.Content?.ToString() ?? "";
- if (content.Contains("Добавить") || content.Contains("Изменить"))
- btn.IsEnabled = canEdit;
- if (content.Contains("Удалить"))
- btn.IsEnabled = canDelete;
- }
- }
- }
- private void LoadDrivers()
- {
- try
- {
- string sql = "SELECT * FROM Drivers ORDER BY driverid";
- using var conn = new NpgsqlConnection(Conn);
- conn.Open();
- var adapter = new NpgsqlDataAdapter(sql, conn);
- DataTable dt = new DataTable();
- adapter.Fill(dt);
- dgDrivers.ItemsSource = dt.DefaultView;
- }
- catch (Exception ex)
- {
- MessageBox.Show("Ошибка загрузки: " + ex.Message);
- }
- }
- private void BtnRefresh_Click(object sender, RoutedEventArgs e) => LoadDrivers();
- private void BtnAdd_Click(object sender, RoutedEventArgs e)
- {
- if (AppSession.Role == "driver")
- {
- MessageBox.Show("Нет прав");
- return;
- }
- var dlg = new EditDriverWindow();
- dlg.Title = "Добавление водителя";
- if (dlg.ShowDialog() == true)
- {
- try
- {
- // ✅ ПАРАМЕТРИЗОВАННЫЙ ЗАПРОС (защита от SQL-инъекций)
- string sql = "INSERT INTO Drivers (lastname, fullname, tabnumber) " +
- "VALUES (@lastname, @fullname, @tabnumber)";
- using var conn = new NpgsqlConnection(Conn);
- conn.Open();
- using var cmd = new NpgsqlCommand(sql, conn);
- cmd.Parameters.AddWithValue("@lastname", dlg.LastName ?? "");
- cmd.Parameters.AddWithValue("@fullname", dlg.FullName ?? "");
- cmd.Parameters.AddWithValue("@tabnumber", dlg.TabNumber ?? "");
- int affected = cmd.ExecuteNonQuery();
- if (affected > 0)
- {
- LoadDrivers();
- MessageBox.Show("Водитель успешно добавлен", "Успех",
- MessageBoxButton.OK, MessageBoxImage.Information);
- }
- }
- catch (PostgresException pgEx)
- {
- // Специальная обработка ошибок PostgreSQL
- string errorMsg = "Ошибка базы данных:\n";
- if (pgEx.SqlState == "23505")
- errorMsg += "Табельный номер уже существует!";
- else if (pgEx.SqlState == "23503")
- errorMsg += "Нарушение связей в базе данных.";
- else if (pgEx.SqlState == "42P01")
- errorMsg += "Таблица не найдена. Проверьте структуру БД.";
- else
- errorMsg += pgEx.MessageText + "\nКод: " + pgEx.SqlState;
- MessageBox.Show(errorMsg, "Ошибка",
- MessageBoxButton.OK, MessageBoxImage.Error);
- }
- catch (Exception ex)
- {
- MessageBox.Show("Ошибка: " + ex.Message + "\n\n" + ex.StackTrace,
- "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
- }
- }
- }
- private void BtnEdit_Click(object sender, RoutedEventArgs e)
- {
- if (AppSession.Role == "driver")
- {
- MessageBox.Show("Нет прав");
- return;
- }
- if (dgDrivers.SelectedItem == null)
- {
- MessageBox.Show("Выберите запись");
- return;
- }
- var row = (DataRowView)dgDrivers.SelectedItem;
- var dlg = new EditDriverWindow();
- dlg.Title = "Изменение водителя";
- dlg.DriverId = Convert.ToInt32(row["driverid"]);
- dlg.LastName = row["lastname"].ToString();
- dlg.FullName = row["fullname"].ToString();
- dlg.TabNumber = row["tabnumber"].ToString();
- if (dlg.ShowDialog() == true)
- {
- try
- {
- // ✅ ПАРАМЕТРИЗОВАННЫЙ ЗАПРОС
- string sql = "UPDATE Drivers SET lastname=@lastname, " +
- "fullname=@fullname, tabnumber=@tabnumber " +
- "WHERE driverid=@driverid";
- using var conn = new NpgsqlConnection(Conn);
- conn.Open();
- using var cmd = new NpgsqlCommand(sql, conn);
- cmd.Parameters.AddWithValue("@lastname", dlg.LastName ?? "");
- cmd.Parameters.AddWithValue("@fullname", dlg.FullName ?? "");
- cmd.Parameters.AddWithValue("@tabnumber", dlg.TabNumber ?? "");
- cmd.Parameters.AddWithValue("@driverid", dlg.DriverId);
- cmd.ExecuteNonQuery();
- LoadDrivers();
- MessageBox.Show("Данные обновлены", "Успех",
- MessageBoxButton.OK, MessageBoxImage.Information);
- }
- catch (PostgresException pgEx)
- {
- string errorMsg = "Ошибка базы данных:\n";
- if (pgEx.SqlState == "23505")
- errorMsg += "Табельный номер уже существует!";
- else
- errorMsg += pgEx.MessageText;
- MessageBox.Show(errorMsg, "Ошибка",
- MessageBoxButton.OK, MessageBoxImage.Error);
- }
- catch (Exception ex)
- {
- MessageBox.Show("Ошибка: " + ex.Message);
- }
- }
- }
- private void BtnDelete_Click(object sender, RoutedEventArgs e)
- {
- if (AppSession.Role != "admin")
- {
- MessageBox.Show("Только администратор может удалять");
- return;
- }
- if (dgDrivers.SelectedItem == null)
- {
- MessageBox.Show("Выберите запись");
- return;
- }
- var row = (DataRowView)dgDrivers.SelectedItem;
- int id = Convert.ToInt32(row["driverid"]);
- if (MessageBox.Show("Удалить запись?", "Подтверждение",
- MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
- {
- try
- {
- string sql = "DELETE FROM Drivers WHERE driverid = @id";
- using var conn = new NpgsqlConnection(Conn);
- conn.Open();
- using var cmd = new NpgsqlCommand(sql, conn);
- cmd.Parameters.AddWithValue("@id", id);
- cmd.ExecuteNonQuery();
- LoadDrivers();
- MessageBox.Show("Запись удалена", "Успех",
- MessageBoxButton.OK, MessageBoxImage.Information);
- }
- catch (PostgresException pgEx)
- {
- string errorMsg = "Ошибка базы данных:\n";
- if (pgEx.SqlState == "23503")
- errorMsg += "Нельзя удалить: водитель закреплён за машиной!";
- else
- errorMsg += pgEx.MessageText;
- MessageBox.Show(errorMsg, "Ошибка",
- MessageBoxButton.OK, MessageBoxImage.Error);
- }
- catch (Exception ex)
- {
- MessageBox.Show("Ошибка: " + ex.Message);
- }
- }
- }
- }
- }
|