Работа с БД на C#
Приветствую! Здесь вы наверняка найдете, что ищете. Примеры в лаборатории рассчитаны на то, что мы разбираем что-то конкретное.
Текущая статья посвящена работе с базой данных на C# — ADO.NET, CRUD и параметризованные запросы.
Поэтому за теорией по текущей теме вам — в энциклопедию. Если ещё не погружались, то маршрут прост:
- Основы
- Система и сеть
- Данные и разметка
- Код и разработка
- Языки
- Искусственный интеллект
- Проект
- Инфраструктура и безопасность
- Спин-офф
Обязательно пройдитесь.
А теперь приступим к нашему предмету.
Работа с БД на C#
Работа с базой данных — это фундаментальная задача в большинстве приложений: от простых утилит до масштабных корпоративных систем. В экосистеме .NET существует несколько подходов к взаимодействию с реляционными СУБД, и все они опираются на стандартные интерфейсы из пространства имён Система.Данные. Наиболее распространённые способы:
- ADO.NET — низкоуровневый доступ к данным через провайдеры.
- Entity Framework (EF Core) — высокоуровневый ORM (Object-Relational Mapper).
- Dapper — лёгкий микрослой поверх ADO.NET для удобного маппинга.
В этом примере рассматриваются все три подхода на основе Microsoft SQL Server и SQLite, чтобы показать разницу в уровне абстракции и объёме кода.
Подготовка: создание тестовой базы данных
Для демонстрации используется SQLite — встраиваемая СУБД без необходимости установки сервера. Файл базы создаётся автоматически при первом подключении.
SQL-скрипт для создания таблицы:
CREATE TABLE IF NOT EXISTS Users (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
Name TEXT NOT NULL,
Email TEXT NOT NULL UNIQUE,
Age INTEGER
);
1. Работа через ADO.NET (низкоуровневый подход)
ADO.NET предоставляет прямой контроль над соединением, командами и транзакциями. Этот подход требует больше шаблонного кода, но даёт максимальную гибкость.
Особенности ADO.NET:
- Явное управление соединением (
Open,Close). - Использование параметризованных запросов для защиты от SQL-инъекций.
- Ручная обработка
DataReaderдля чтения результатов. - Отсутствие автоматического преобразования строк в объекты.
2. Работа через Entity Framework Core (ORM)
Entity Framework Core — официальный ORM от Microsoft. Он позволяет работать с базой данных через объекты C#, а не через SQL-запросы.
Шаг 1: Установка зависимостей
Добавьте пакеты через NuGet:
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
Шаг 2: Определение модели и контекста
Шаг 3: Использование
Преимущества EF Core:
- Автоматическое создание схемы БД из моделей (Code First).
- LINQ-запросы вместо SQL.
- Отслеживание изменений объектов.
- Миграции для управления изменениями схемы.
Недостатки:
- Больший оверхед по сравнению с ADO.NET.
- Сложность отладки "сгенерированного" SQL.
3. Работа через Dapper (микро-ORM)
Dapper — лёгкая библиотека от команды Stack Overflow. Она расширяет IDbConnection, добавляя методы для автоматического маппинга результатов SQL-запросов в объекты.
Установка
dotnet add package Dapper
dotnet add package Система.data.SQLite
Пример использования
Особенности Dapper:
- Минимальный оверхед — почти как ADO.NET по скорости.
- Автоматический маппинг полей в свойства объекта.
- Поддержка множественных результатов, списков, асинхронных операций.
- Требует написания SQL вручную, но без ручной обработки
DataReader.
Сравнение подходов
| Критерий | ADO.NET | Entity Framework Core | Dapper |
|---|---|---|---|
| Уровень абстракции | Низкий | Высокий | Средний |
| Производительность | Максимальная | Ниже из-за оверхеда | Почти как ADO.NET |
| Объём кода | Большой | Минимальный | Умеренный |
| Гибкость SQL | Полная | Ограниченная (LINQ) | Полная |
| Защита от инъекций | Через параметры | Автоматическая | Через параметры |
| Миграции | Нет | Встроены | Нет |
Рекомендации по выбору
- Используйте ADO.NET, если требуется максимальный контроль, работа с legacy-системами или высокая производительность критична.
- Выбирайте EF Core, если проект новый, команда предпочитает объектную модель, и важна скорость разработки.
- Отдавайте предпочтение Dapper, если нужно сочетать производительность ADO.NET с удобством маппинга, особенно в микросервисах или API с большим числом запросов.
Безопасность и лучшие практики
- Всегда используйте параметризованные запросы — никогда не конкатенируйте строки для формирования SQL.
- Не храните строки подключения в коде — используйте
appsettings.jsonили переменные окружения. - Оборачивайте соединения в
using, чтобы гарантировать их закрытие. - Для продакшена применяйте пулы соединений, таймауты и логирование ошибок.
- При работе с паролями или персональными данными — шифруйте их перед сохранением.