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

«Что такое ADO.NET?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ADO.NET — это низкоуровневая, высокопроизводительная технология доступа к данным в экосистеме .NET. Это не ORM, а набор классов (System.Data и пространства имен провайдеров, например, System.Data.SqlClient), которые предоставляют прямой контроль над выполнением SQL-команд и управлением соединениями.

Основные компоненты и их назначение:

Компонент Назначение Когда использовать
Connection (SqlConnection) Устанавливает физическое соединение с БД. Основа для любой операции.
Command (SqlCommand) Инкапсулирует SQL-запрос или хранимую процедуру для выполнения. Для SELECT, INSERT, UPDATE, DELETE, вызовов хранимых процедур.
DataReader (SqlDataReader) Предоставляет быстрый, forward-only, read-only поток данных с сервера. Для чтения больших объемов данных, когда не нужна кэширование в памяти.
DataAdapter (SqlDataAdapter) Мост между источником данных и отключенными объектами DataSet/DataTable. Заполняет их и обновляет изменения. Для работы с небольшими наборами данных в отключенном режиме (например, привязка к UI).
DataSet / DataTable In-memory кэш реляционных данных с поддержкой отношений, constraints и отслеживания изменений. Для сложной манипуляции данными без постоянного соединения с БД.

Пример использования (Connected Mode с DataReader):

using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand("SELECT Id, Name FROM Products WHERE CategoryId = @CategoryId", connection))
{
    command.Parameters.AddWithValue("@CategoryId", 5); // Защита от SQL-инъекций
    await connection.OpenAsync();
    using (var reader = await command.ExecuteReaderAsync())
    {
        while (await reader.ReadAsync())
        {
            int id = reader.GetInt32(reader.GetOrdinal("Id"));
            string name = reader.GetString(reader.GetOrdinal("Name"));
            Console.WriteLine($"{id}: {name}");
        }
    }
} // Соединение автоматически закрывается

Плюсы: Максимальная производительность, полный контроль над SQL, низкие накладные расходы. Минусы: Много шаблонного (boilerplate) кода, необходимость вручную маппить данные на объекты, риск забыть закрыть соединение (решается using). ADO.NET часто служит основой для более высокоуровневых ORM, таких как Entity Framework.