75 lines
8.9 KiB
Markdown
75 lines
8.9 KiB
Markdown
# 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`. Объясни, что курьер (адаптер) сам сбегал в базу, залил всё в таблицу и разорвал связь с БД.
|
||
|
||
Удачи на защите! Ты справишься! 💪
|