Ответ
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.