Работа с БД на C#

Приветствую! Здесь вы наверняка найдете, что ищете. Примеры в лаборатории рассчитаны на то, что мы разбираем что-то конкретное.

Текущая статья посвящена работе с базой данных на C# — ADO.NET, CRUD и параметризованные запросы.

Поэтому за теорией по текущей теме вам — в энциклопедию. Если ещё не погружались, то маршрут прост:

  1. Основы
  2. Система и сеть
  3. Данные и разметка
  4. Код и разработка
  5. Языки
  6. Искусственный интеллект
  7. Проект
  8. Инфраструктура и безопасность
  9. Спин-офф

Обязательно пройдитесь.

А теперь приступим к нашему предмету.

Теория и соседние материалы

Работа с БД на 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, чтобы гарантировать их закрытие.
  • Для продакшена применяйте пулы соединений, таймауты и логирование ошибок.
  • При работе с паролями или персональными данными — шифруйте их перед сохранением.