← Назад к вопросам

Что такое ADO.NET?

1.0 Junior🔥 91 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Обзор ADO.NET

ADO.NET — это набор классов в .NET Framework и .NET Core/.NET 5+, предоставляющий единую модель программирования для работы с различными источниками данных: реляционными базами данных (SQL Server, Oracle, MySQL и др.), XML-документами, а также другими структурированными хранилищами. Это эволюция более старой технологии ADO (ActiveX Data Objects), полностью переработанная для платформы .NET с акцентом на распределенные приложения и отключенную архитектуру.

Ключевые принципы и архитектура

Архитектура ADO.NET строится вокруг двух фундаментальных моделей доступа к данным:

  1. Подключенная модель (Connected Model)
    *   Используется для быстрых операций, требующих постоянного соединения с БД (например, онлайн-транзакции).
    *   Основные классы: `SqlConnection`, `SqlCommand`, `SqlDataReader`.
    *   `DataReader` предоставляет **потоковый, последовательный, доступ только для чтения** к данным, что минимизирует использование памяти.

  1. Отключенная модель (Disconnected Model)
    *   Позволяет работать с данными локально, без поддержания активного соединения с БД. Это основа для многоуровневых (n-tier) приложений.
    *   Центральная сущность — **`DataSet`** — представляет собой резидентную в памяти копию части базы данных, включающую таблицы (`DataTable`), связи (`DataRelation`), ограничения и данные.
    *   Для взаимодействия между `DataSet` и БД используются **`DataAdapter`** (например, `SqlDataAdapter`) и **`DataTable`**.

Основные пространства имен и классы

  • System.Data.Common — содержит абстрактные классы-поставщики (DbConnection, DbCommand), обеспечивающие независимость от конкретной СУБД.
  • System.Data.SqlClient — поставщик данных для Microsoft SQL Server (для .NET Framework и .NET Core до версии 3.1). Рекомендуется использовать Microsoft.Data.SqlClient для современных проектов.
  • System.Data.Odbc, System.Data.OleDb — для доступа к устаревшим источникам.
  • Microsoft.EntityFrameworkCore — хотя это часть Entity Framework Core, он часто используется вместе с или вместо "сырого" ADO.NET для ORM-задач.

Пример использования (Подключенная модель с SqlClient)

using Microsoft.Data.SqlClient; // или System.Data.SqlClient для старых проектов
using System.Data;

public class ProductRepository
{
    private readonly string _connectionString;

    public ProductRepository(string connectionString)
    {
        _connectionString = connectionString;
    }

    public Product GetProduct(int id)
    {
        Product product = null;
        // 1. Создание и открытие подключения (используется using для гарантированного освобождения)
        using (SqlConnection connection = new SqlConnection(_connectionString))
        {
            // 2. Создание команды с параметризованным запросом (защита от SQL-инъекций)
            string sql = "SELECT Id, Name, Price FROM Products WHERE Id = @ProductId";
            SqlCommand command = new SqlCommand(sql, connection);
            command.Parameters.AddWithValue("@ProductId", id);

            connection.Open();
            // 3. Выполнение команды и получение потока данных через DataReader
            using (SqlDataReader reader = command.ExecuteReader())
            {
                if (reader.Read()) // Чтение одной записи
                {
                    product = new Product
                    {
                        Id = reader.GetInt32(reader.GetOrdinal("Id")),
                        Name = reader.GetString(reader.GetOrdinal("Name")),
                        Price = reader.GetDecimal(reader.GetOrdinal("Price"))
                    };
                }
            }
            // 4. Соединение автоматически закрывается в блоке using
        }
        return product;
    }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

Пример использования (Отключенная модель с DataSet)

public DataSet GetCategoriesAndProducts()
{
    DataSet dataSet = new DataSet();
    
    using (SqlConnection connection = new SqlConnection(_connectionString))
    {
        // DataAdapter выступает мостом между БД и DataSet
        SqlDataAdapter categoriesAdapter = new SqlDataAdapter(
            "SELECT CategoryId, CategoryName FROM Categories", connection);
        SqlDataAdapter productsAdapter = new SqlDataAdapter(
            "SELECT ProductId, ProductName, CategoryId FROM Products", connection);
        
        // Заполняем DataSet данными из двух таблиц
        categoriesAdapter.Fill(dataSet, "Categories");
        productsAdapter.Fill(dataSet, "Products");
        
        // Устанавливаем связь между таблицами в памяти
        DataRelation relation = new DataRelation("CatProdRel",
            dataSet.Tables["Categories"].Columns["CategoryId"],
            dataSet.Tables["Products"].Columns["CategoryId"]);
        dataSet.Relations.Add(relation);
    }
    
    return dataSet; // DataSet готов для работы без активного подключения
}

Преимущества и современное применение

  • Производительность: DataReader обеспечивает максимальную скорость чтения больших объемов данных.
  • Контроль: Полный контроль над SQL-запросами, транзакциями (SqlTransaction) и управлением соединениями (пулы соединений).
  • Независимость от конкретной БД: Благодаря использованию базовых классов (DbConnection) и фабрики поставщиков (DbProviderFactories).
  • Работа в отключенном режиме: DataSet идеален для сценариев с веб-сервисами, кэшированием данных и сложной манипуляцией данными на клиенте.

Сравнение с Entity Framework Core

Хотя Entity Framework Core (EF Core) стал де-факто стандартом для многих проектов благодаря ORM-подходу, ADO.NET остается критически важным:

  • Для высоконагруженных систем, где важен каждый миллисекунд.
  • При работе со сложными хранимыми процедурами или специфичными оптимизациями SQL.
  • В legacy-коде и проектах, где EF Core избыточен.
  • Как "низкоуровневый" слой, который может использоваться внутри репозиториев или самим EF Core.

Итог: ADO.NET — это фундаментальная, гибкая и производительная технология доступа к данным в экосистеме .NET. Понимание ее принципов обязательно для бэкенд-разработчика, даже при активном использовании ORM, так как оно позволяет принимать взвешенные архитектурные решения и эффективно решать задачи, выходящие за рамки возможностей ORM-систем. В современных приложениях ADO.NET часто используется избирательно, в комбинации с более высокоуровневыми инструментами.