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