Перейти к основному содержимому

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 и собеседований.


Как читать эту статью на практике

Чтобы материал был полезен в рабочем коде, идите по шагам:

  1. Сначала отработайте базовый цикл Connection -> Command -> Reader/Scalar.
  2. Затем закрепите параметризованные запросы и обработку ошибок.
  3. После этого сравните один и тот же сценарий в чистом ADO.NET, Dapper и EF Core.

Так вы увидите, где ADO.NET даёт максимальный контроль, а где лучше использовать более высокий уровень абстракции.


Три кита ADO.NET

ОбъектРоль
DbConnectionСеанс с БД (Open / Close, пул соединений)
DbCommandТекст SQL или процедура + параметры
DbDataReaderПотоковое чтение строк (forward-only)

Дополнительно: DbTransaction, DbDataAdapter + DataSet для офлайн-редактирования таблиц в памяти.


Провайдеры данных

ПакетСУБД
Microsoft.Data.SqlClientSQL Server, Azure SQL
NpgsqlPostgreSQL
Microsoft.Data.SqliteSQLite
MySqlConnector / MySql.DataMySQL / 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.NETADO — COM 1990-х; ADO.NET — managed .NET

Что попробовать

  1. ADO.NET и Dapper — первая программа — CRUD на ADO.NET и Dapper.
  2. Тот же сценарий в Entity Framework Core — первая программа на EF Core.
  3. Транзакции — раздел 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")OpenExecute → цикл по 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.