AdoNetShop/README.md
2026-10-05 06:02:05 +05:00

75 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AdoNetShop: Твоя первая лабораторная по ADO.NET 🎓
Привет! Это учебный проект интернет-магазина. Его главная цель — показать тебе, как работает технология **ADO.NET** изнутри. Мы будем общаться с базой данных Microsoft SQL Server "вручную", без всяких умных прослоек вроде Entity Framework. Это нужно, чтобы ты понял самые основы.
---
## 📚 Немного скучной (но нужной) теории простыми словами
### Что вообще такое ADO.NET?
Представь, что твоя программа (на C#) и база данных (SQL Server) говорят на разных языках и живут в разных городах. ADO.NET — это набор инструментов (переводчиков, почтальонов, телефонов), которые позволяют им общаться.
Мы не используем ORM (Entity Framework), потому что ORM делает всё за тебя "под капотом". В этой лабе мы лезем под капот сами.
### Зачем мы это учим?
1. **Чтобы понимать, как всё работает на самом деле.** Любая крутая ORM в итоге всё равно превращает свой код в команды ADO.NET.
2. **Скорость и контроль.** Иногда нужно написать супер-хитрый и быстрый запрос. Ручной SQL через ADO.NET даст тебе максимальную скорость.
### Главные герои ADO.NET (Что нужно знать для защиты):
* 🔌 **`SqlConnection` (Подключение):** Это твой телефонный провод до базы данных. Чтобы что-то сказать базе, нужно поднять трубку (`Open()`), а потом обязательно положить её (`Close()`, или использовать конструкцию `using`).
* 📝 **`SqlCommand` (Команда):** Это то, *что* ты говоришь в трубку. Обычно это SQL-запросы (`SELECT`, `INSERT` и т.д.).
* 🛡️ **`SqlParameter` (Параметр):** Это твоя защита от злодеев. **Никогда** не склеивай SQL-строку плюсами (типа `"SELECT * FROM Users WHERE Name = " + name`). Хакерам хватит 5 минут, чтобы сломать базу через SQL-инъекцию. Мы передаем переменные *только* через параметры (`@Name`).
* 📖 **`SqlDataReader` (Чтец данных):** Представь, что база диктует тебе длиннющий список товаров по телефону. `DataReader` слушает и записывает строку за строкой. Он работает очень быстро, но *только вперед* и требует, чтобы телефонная линия (Connection) была открыта. (Это называется **Connected** подход).
* 📦 **`SqlDataAdapter` и `DataTable`:** А это другой подход. `DataAdapter` — это курьер. Он сам едет к базе, забирает *все* данные разом, привозит их тебе и кладет в коробку (`DataTable` в памяти компьютера). После этого он сам вешает трубку. Теперь ты можешь ковыряться в этой коробке сколько угодно, не занимая базу данных. (Это называется **Disconnected** подход).
* 🤝 **Транзакция (`SqlTransaction`):** Сделка по принципу "Всё или ничего". Представь перевод денег: списали у тебя, но не зачислили другу. Плохо! Транзакция гарантирует: если база начала делать заказ (создала заказ -> списала товары со склада -> добавила позиции), и вдруг свет моргнул на списании склада — она отменит всё обратно (`Rollback`). Если всё супер — закрепит (`Commit`).
---
## 🚀 Как запустить эту штуку на твоем компе
Чтобы проект заработал, тебе нужны две вещи: работающая база данных и запущенный код.
### Шаг 1: Готовим Базу Данных
1. Убедись, что у тебя установлен **Microsoft SQL Server** (подойдет версия Express) и программа для управления им, например, **SQL Server Management Studio (SSMS)**.
2. Открой папку `database` в этом проекте.
3. Открой SSMS и подключись к своему серверу.
4. Выполни скрипты строго по очереди:
* ▶️ Сначала выполни код из файла `01_create_database.sql` (Это создаст пустую БД).
* ▶️ Затем `02_create_tables.sql` (Создаст нужные таблички).
* ▶️ Затем `03_insert_data.sql` (Заполнит их тестовыми товарами и клиентами).
### Шаг 2: Настраиваем проект
1. Открой файл `AdoNetShop/appsettings.json`.
2. Найди там строку `ConnectionStrings -> DefaultConnection`.
3. Тебе нужно сказать программе, как зовут твой SQL сервер.
* Если у тебя обычный разработческий SQL, оставь `Server=localhost`.
* Если ты ставил SQL Server Express, скорее всего тебе нужно поменять это на `Server=.\\SQLEXPRESS`.
### Шаг 3: Запускаем!
1. Открой терминал (или командную строку) в папке `AdoNetShop` (там, где лежит файл `.csproj`).
2. Напиши команду: `dotnet run`
3. Должно появиться красивое консольное меню магазина.
---
## 👨‍🏫 Что показывать преподавателю на защите?
Препод точно спросит, где и как ты использовал ADO.NET. Вот твоя шпаргалка:
1. **Как ты подключаешься к базе?**
* Покажи файл `Data/DbConnectionFactory.cs`. Расскажи, что строку подключения ты берешь из конфига (это хорошая практика!), а не хардкодишь в коде.
2. **Как работает CRUD (Создание, Чтение, Обновление, Удаление)?**
* Открой `Data/ProductRepository.cs`.
* Покажи метод `GetByIdAsync`. Обрати внимание на `SqlCommand` и то, как ты добавляешь параметры (`command.Parameters.Add`). Расскажи про `SqlDataReader`.
* Покажи метод `CreateAsync`. Обрати внимание на `ExecuteScalarAsync` — объясни, что он нужен, чтобы база вернула тебе ID только что созданного товара.
3. **Где у тебя транзакция?**
* Гордо открывай `Data/OrderRepository.cs` и показывай метод `CreateOrderWithTransactionAsync`.
* Объясни: "Сначала мы открываем транзакцию. Потом пытаемся создать заказ и списать товары. Если хоть одного товара нет на складе, я выбрасываю ошибку, код прыгает в блок `catch`, и делает `RollbackAsync()` — отменяет всё. Если всё гладко — `CommitAsync()`".
* *Для эффекта:* Запусти программу, нажми пункт "8" и попробуй купить 1000 ноутбуков (их столько нет). Покажи, что заказ не создался.
4. **А где Disconnected подход (отсоединенная модель)?**
* Открой пункт меню "10" в запущенной программе.
* Открой метод `GetProductsTableAsync` в `ProductRepository.cs`.
* Покажи класс `SqlDataAdapter` и `DataTable`. Объясни, что курьер (адаптер) сам сбегал в базу, залил всё в таблицу и разорвал связь с БД.
Удачи на защите! Ты справишься! 💪