Назад Вперед Зміст

Додавання запису до таблиці бази даних. ADO.NET

Додавання запису до таблиці "Книги" з використанням ADO.NET передбачає створення та виконання SQL-команди INSERT. У цьому прикладі ми використовуватимемо OleDbCommand для виконання команди INSERT INTO, щоб додати новий запис до бази даних Access.

Розмітка форми (попередньо копіюємо попередній проект):

    Додайте на форму такі елементи керування:
  1. TextBox для введення автора книги з ім'ям textBoxAuthor
  2. TextBox для введення назви книги з ім'ям textBoxTitle
  3. TextBox для введення власника книги з ім'ям textBoxOwner
  4. TextBox для введення серії книги з ім'ям textBoxSeriy
  5. TextBox для введення року видання з ім'ям textBoxYearPublished
  6. TextBox для введення ціни книги з ім'ям textBoxCena
  7. Button для додавання нового запису з ім'ям buttonAddBook

Код форми. Пояснення коду

  1. Ініціалізація компонентів: У конструкторі форми ініціалізуються DataSet та BindingSource.
  2. Завантаження даних: Метод LoadBooks використовується для завантаження даних з таблиці "Книги" та заповнення DataSet. Дані прив'язуються до BindingSource, який пов'язаний з DataGridView.
    using System;
    using System.Data;
    using System.Data.OleDb;
    using System.Windows.Forms;
    
    namespace SUBD
    {
        public partial class Form1 : Form
        {
            // Рядок підключення до бази даних Access
            private string connectionString = @"Provider=Microsoft.ACE.OLEDB.16.0;Data Source=[DataDirectory|\KHMTM.mdb";
            
            // Джерело даних для прив'язки
            private BindingSource bindingSource;
            
            // Конструктор форми
            public Form1()
            {
                InitializeComponent();
                bindingSource = new BindingSource();
            }
            
            // Обробник події завантаження форми
            private void Form1_Load(object sender, EventArgs e)
            {
                // Встановлюємо джерело даних для DataGridView
                dataGridView1.DataSource = bindingSource;
                
                // Завантажуємо дані про книги
                LoadBooks();
            }
  3. Обробник події кнопки "Відобразити дані таблиці": Метод buttonLoadData_Click викликається при натисканні кнопки та відображає всі записи таблиці в DataGridView.
    private void buttonLoadData_Click(object sender, EventArgs e)
    {
        // Використання з'єднання з базою даних
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            try
            {
                // Відкриття з'єднання
                connection.Open();
                
                // Створення адаптера даних для вибірки всіх записів з таблиці "Книги"
                OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM Книги", connection);
                
                // Створення таблиці даних
                DataTable dataTable = new DataTable();
                
                // Заповнення таблиці даними
                adapter.Fill(dataTable);
                
                // Встановлення джерела даних для DataGridView
                dataGridView1.DataSource = dataTable;
            }
            catch (Exception ex)
            { 
                // Виведення повідомлення про помилку
                MessageBox.Show("Помилка: " + ex.Message); 
            }
        }
    }
    
    private void button1_Click(object sender, EventArgs e)
    { 
        // Закриття додатку
        Application.Exit(); 
    }
  4. Обробник події кнопки додавання: Метод buttonAddBook_Click перевіряє коректність заповнення полів та викликає метод AddBook для додавання нового запису.
    private void buttonAddBook_Click(object sender, EventArgs e)
    {
        // Перевірка на валідність введених даних
        if (string.IsNullOrWhiteSpace(textBoxTitle.Text) ||
            string.IsNullOrWhiteSpace(textBoxAuthor.Text) || 
            string.IsNullOrWhiteSpace(textBoxOwner.Text) || 
            string.IsNullOrWhiteSpace(textBoxSeriy.Text) ||
            !int.TryParse(textBoxYearPublished.Text, out int year) || 
            !float.TryParse(textBoxCena.Text, out float cena))
        {
            MessageBox.Show("Будь ласка, введіть коректні дані про книгу.");
            return;
        }
    
        // Додавання книги з введеними даними
        AddBook(textBoxAuthor.Text, textBoxTitle.Text, textBoxOwner.Text, textBoxSeriy.Text, year, cena);
    }
  5. Додавання нового запису: Метод AddBook використовує OleDbCommand для виконання SQL-запиту INSERT INTO.

    Для роботи з грошовими значеннями в Access використовується тип OleDbType.Currency.

    Захист від SQL-ін'єкцій: SQL-ін'єкція - це тип атаки, коли зловмисник може модифікувати SQL-запит через необроблений ввід даних.

    Приклад вразливого коду:

    string query = "SELECT * FROM Users WHERE Username = '" + username + "' AND Password = '" + password + "'";

    Якщо ввести ' OR '1'='1 як ім'я користувача, запит завжди поверне всі записи.

    Як запобігти: Використовуйте параметризовані запити. Для OleDbCommand використовуються параметри у форматі @Xxxxx:

    private void AddBook(string author, string title, string izdat, string seriy, int year, float cena)
    {
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            try
            {
                connection.Open();
                string query = 
                    "INSERT INTO Книги (Автор, Название, Издательство, Серия, Год_издания, Цена) " +
                    "VALUES (@Author, @Title, @Owner, @Seriy, @YearPublished, @Cena)";  // Виправлено роздільники на коми
                
                using (OleDbCommand command = new OleDbCommand(query, connection))
                {
                    // Додавання параметрів для безпеки від SQL-ін'єкцій
                    command.Parameters.AddWithValue("@Author", author);
                    command.Parameters.AddWithValue("@Title", title);
                    command.Parameters.AddWithValue("@Owner", izdat);
                    command.Parameters.AddWithValue("@Seriy", seriy);
                    command.Parameters.AddWithValue("@YearPublished", year);
                    command.Parameters.AddWithValue("@Cena", cena);
                    
                    command.ExecuteNonQuery();
                }
                
                MessageBox.Show("Книгу успішно додано.");
                LoadBooks(); // Оновлення даних у DataGridView після додавання
            }
            catch (Exception ex)
            {
                MessageBox.Show("Помилка: " + ex.Message);
            }
        }
    }
  6. Після успішного додавання запис оновлюється методом LoadBooks.
    private void LoadBooks()
    {
        using (OleDbConnection connection = new OleDbConnection(connectionString))
        {
            try
            {
                // Відкриття з'єднання з базою даних
                connection.Open();
                
                // SQL-запит для отримання всіх книг
                string query = "SELECT * FROM Книги";
                
                // Створення адаптера та заповнення DataSet
                OleDbDataAdapter adapter = new OleDbDataAdapter(query, connection);
                книгиDataSet.Clear(); // Очищення попередніх даних
                adapter.Fill(книгиDataSet, "Книги"); // Заповнення DataSet новими даними
                
                // Встановлення джерела даних для DataGridView
                dataGridView1.DataSource = книгиDataSet.Tables["Книги"];
            }
            catch (Exception ex)
            {
                // Виведення повідомлення про помилку
                MessageBox.Show("Помилка: " + ex.Message, "Помилка завантаження", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
  7. Стовпець типу "Лічильник" (AutoNumber) у базі даних Access генерує значення автоматично і не повинен вказуватись у INSERT INTO.

Назад Вперед Зміст