ADO.NET - доступ к данным
Play ITЗагрузка интерактивного демо…
ADO.NET сегодня
ADO.NET - низкоуровневый доступ к данным
ADO.NET — низкоуровневый способ работы с реляционными базами в .NET: явное соединение, SQL и чтение результата. EF Core и Dapper опираются на те же идеи (соединение, команда, параметры).
Практика с кодом: ADO.NET и Dapper — первая программа. Обзор ORM и LINQ: работа с БД в C#.
Ниже — современная модель ADO.NET, затем историческая справка про классический ADO (COM) для legacy и собеседований.
Как читать эту статью на практике
Чтобы материал был полезен в рабочем коде, идите по шагам:
- Сначала отработайте базовый цикл
Connection -> Command -> Reader/Scalar. - Затем закрепите параметризованные запросы и обработку ошибок.
- После этого сравните один и тот же сценарий в чистом ADO.NET, Dapper и EF Core.
Так вы увидите, где ADO.NET даёт максимальный контроль, а где лучше использовать более высокий уровень абстракции.
Три кита ADO.NET
| Объект | Роль |
|---|---|
DbConnection | Сеанс с БД (Open / Close, пул соединений) |
DbCommand | Текст SQL или процедура + параметры |
DbDataReader | Потоковое чтение строк (forward-only) |
Дополнительно: DbTransaction, DbDataAdapter + DataSet для офлайн-редактирования таблиц в памяти.
Провайдеры данных
| Пакет | СУБД |
|---|---|
Microsoft.Data.SqlClient | SQL Server, Azure SQL |
Npgsql | PostgreSQL |
Microsoft.Data.Sqlite | SQLite |
MySqlConnector / MySql.Data | MySQL / MariaDB |
Строка подключения — в appsettings.json, секретах или переменных окружения.
Минимальный пример (SQLite)
using Microsoft.Data.Sqlite;
const string cs = "Data Source=app.db";
await using var conn = new SqliteConnection(cs);
await conn.OpenAsync();
await using var cmd = new SqliteCommand(
"SELECT COUNT(*) FROM Users WHERE Active = @active;", conn);
cmd.Parameters.AddWithValue("@active", 1);
var count = (long)(await cmd.ExecuteScalarAsync() ?? 0);
Console.WriteLine($"Активных пользователей: {count}");
Значение @active передаётся отдельно от текста SQL — защита от SQL-инъекций.
ADO.NET и EF Core
EF Core использует ADO.NET под капотом. Для сложных запросов:
await context.Database.ExecuteSqlRawAsync(
"UPDATE Books SET Price = Price * @factor WHERE Year < @year",
new SqliteParameter("@factor", 1.1),
new SqliteParameter("@year", 2020));
или Dapper / чистый ADO.NET.
Частые ошибки
| Ошибка | Решение |
|---|---|
| Утечка соединений | await using для connection и command |
SQL из $"… {id} …" | Только параметры @id |
| Долгий открытый reader | Закройте reader до следующей команды на том же соединении |
| Путаница ADO и ADO.NET | ADO — COM 1990-х; ADO.NET — managed .NET |
Что попробовать
- ADO.NET и Dapper — первая программа — CRUD на ADO.NET и Dapper.
- Тот же сценарий в Entity Framework Core — первая программа на EF Core.
- Транзакции — раздел SQL в 3-data-markup.
Дальше
Историческая справка — классический Microsoft ADO (COM)
:::note Для legacy и собеседований Раздел описывает ADO (ActiveX Data Objects) — технологию 1990-х на COM/OLE DB. В современных .NET-проектах используйте ADO.NET (раздел выше). :::
Microsoft ActiveX Data Objects (ADO) — объектная модель Microsoft для доступа к данным через OLE DB. Стандарт для VB6, классического ASP и VBA.
Архитектурное положение ADO
ADO делегирует работу поставщикам OLE DB. Приложение оперирует Connection, Command, Recordset, Field, Parameter.
Основные объекты ADO
Connection — сеанс с источником данных. Command — SQL или процедура с параметрами. Recordset — набор строк с навигацией и изменением данных. Field — столбец записи. Parameter — значение в параметризованном запросе.
ADO в классическом ASP
Типичный сценарий: Server.CreateObject("ADODB.Connection") → Open → Execute → цикл по Recordset → HTML. Идея отделения доступа к данным от представления легла в MVC и слои repository.
От ADO к ADO.NET
.NET потребовал управляемых типов — DataSet, провайдеры SqlClient, асинхронные API. ADO.NET сохранил "соединение — команда — результат", без центрального Recordset.
Классический ADO ещё встречается в VB6, VBA, старых ASP — при миграции код переписывают на ADO.NET, EF или Dapper.
Безопасность и отладка (ADO)
Параметризованные запросы обязательны. Коллекция Connection.Errors помогает разбирать сбои OLE DB. Логирование команд и времени выполнения — best practice и для ADO.NET.