using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Dem2 { using System; using System.Data; using System.Windows.Forms; using MySql.Data.MySqlClient; // Убедись, что установлен пакет MySql.Data public partial class MaterialEditForm : Form { private int? materialIdToEdit = null; public MaterialEditForm() { InitializeComponent(); LoadMaterialTypes(); // Загрузка типов при открытии формы button1.Click += buttonSave_Click; } // Конструктор для редактирования public MaterialEditForm(int materialId) : this() { materialIdToEdit = materialId; } private void MaterialEditForm_Load(object sender, EventArgs e) { if (materialIdToEdit.HasValue) { LoadMaterialData(); // Загрузка данных для редактирования } } private void LoadMaterialTypes() { try { using (var conn = DataBase.GetConnection()) { conn.Open(); string sql = "SELECT id, type_name FROM material_types ORDER BY type_name"; MySqlDataAdapter adapter = new MySqlDataAdapter(sql, conn); DataTable dt = new DataTable(); adapter.Fill(dt); comboBoxMaterialType.DataSource = dt; comboBoxMaterialType.DisplayMember = "type_name"; comboBoxMaterialType.ValueMember = "id"; } } catch (Exception ex) { MessageBox.Show("Ошибка загрузки типов материалов: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); // Лучше не закрывать форму, если типы не загрузились, но можно и Close(); } } private void LoadMaterialData() { try { using (var conn = DataBase.GetConnection()) { conn.Open(); string sql = @" SELECT material_name, material_type_id, current_stock, unit, pack_size, min_stock, price_per_unit FROM materials WHERE id = @id"; using (var cmd = new MySqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@id", materialIdToEdit); using (var reader = cmd.ExecuteReader()) { if (reader.Read()) { textBoxName.Text = reader["material_name"].ToString(); // Обработка возможного NULL в material_type_id if (reader["material_type_id"] != DBNull.Value) { comboBoxMaterialType.SelectedValue = Convert.ToInt32(reader["material_type_id"]); } else { comboBoxMaterialType.SelectedIndex = -1; // или установить первый элемент } numericUpDownCurrentStock.Value = reader["current_stock"] != DBNull.Value ? Convert.ToDecimal(reader["current_stock"]) : 0; textBoxUnit.Text = reader["unit"].ToString(); // может быть NULL -> "" numericUpDownPackSize.Value = reader["pack_size"] != DBNull.Value ? Convert.ToDecimal(reader["pack_size"]) : 1; // по умолчанию 1 numericUpDownMinStock.Value = reader["min_stock"] != DBNull.Value ? Convert.ToDecimal(reader["min_stock"]) : 0; numericUpDownPricePerUnit.Value = reader["price_per_unit"] != DBNull.Value ? Convert.ToDecimal(reader["price_per_unit"]) : 0; } else { MessageBox.Show("Материал с указанным ID не найден.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning); this.DialogResult = DialogResult.Abort; this.Close(); } } } } } catch (Exception ex) { MessageBox.Show("Ошибка загрузки данных материала: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void buttonSave_Click(object sender, EventArgs e) { // 1. Валидация if (string.IsNullOrWhiteSpace(textBoxName.Text)) { MessageBox.Show("Введите наименование материала.", "Ошибка ввода", MessageBoxButtons.OK, MessageBoxIcon.Warning); textBoxName.Focus(); return; } if (numericUpDownPricePerUnit.Value < 0) { MessageBox.Show("Цена не может быть отрицательной.", "Ошибка ввода", MessageBoxButtons.OK, MessageBoxIcon.Warning); numericUpDownPricePerUnit.Focus(); return; } if (numericUpDownMinStock.Value < 0) { MessageBox.Show("Минимальное количество не может быть отрицательным.", "Ошибка ввода", MessageBoxButtons.OK, MessageBoxIcon.Warning); numericUpDownMinStock.Focus(); return; } // 2. Подготовка данных string name = textBoxName.Text.Trim(); int? typeId = null; if (comboBoxMaterialType.SelectedValue != null && comboBoxMaterialType.SelectedValue != DBNull.Value) { typeId = Convert.ToInt32(comboBoxMaterialType.SelectedValue); } decimal currentStock = numericUpDownCurrentStock.Value; string unit = textBoxUnit.Text.Trim(); decimal packSize = numericUpDownPackSize.Value; decimal minStock = numericUpDownMinStock.Value; decimal price = numericUpDownPricePerUnit.Value; // 3. SQL string sql; if (materialIdToEdit.HasValue) { sql = @" UPDATE materials SET material_name = @name, material_type_id = @typeId, current_stock = @currentStock, unit = @unit, pack_size = @packSize, min_stock = @minStock, price_per_unit = @price WHERE id = @id"; } else { sql = @" INSERT INTO materials (material_name, material_type_id, current_stock, unit, pack_size, min_stock, price_per_unit) VALUES (@name, @typeId, @currentStock, @unit, @packSize, @minStock, @price)"; } // 4. Выполнение try { using (var conn = DataBase.GetConnection()) { conn.Open(); using (var cmd = new MySqlCommand(sql, conn)) { // Обязательно проверяй на DBNull.Value для nullable полей cmd.Parameters.AddWithValue("@name", name); cmd.Parameters.AddWithValue("@typeId", typeId.HasValue ? (object)typeId.Value : DBNull.Value); cmd.Parameters.AddWithValue("@currentStock", currentStock); cmd.Parameters.AddWithValue("@unit", string.IsNullOrEmpty(unit) ? (object)DBNull.Value : unit); cmd.Parameters.AddWithValue("@packSize", packSize); cmd.Parameters.AddWithValue("@minStock", minStock); cmd.Parameters.AddWithValue("@price", price); if (materialIdToEdit.HasValue) { cmd.Parameters.AddWithValue("@id", materialIdToEdit.Value); } int rowsAffected = cmd.ExecuteNonQuery(); if (rowsAffected > 0) { MessageBox.Show("Материал успешно сохранён.", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information); this.DialogResult = DialogResult.OK; this.Close(); } else { MessageBox.Show("Не удалось сохранить материал. Проверьте данные.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } catch (MySqlException sqlEx) { // Конкретная ошибка MySQL (например, нарушение уникальности, тип данных) MessageBox.Show("Ошибка базы данных: " + sqlEx.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (Exception ex) { // Любая другая ошибка MessageBox.Show("Ошибка сохранения: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void buttonCancel_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; this.Close(); } private void button1_Click(object sender, EventArgs e) { } } }