Загрузка данных
Вот полные ответы на все 42 вопроса для подготовки к зачету.
---
Основы ADO.NET
1. Что такое ADO.NET?
Это набор библиотек и классов в .NET Framework для доступа к данным и управления ими. Он обеспечивает взаимодействие приложений с различными базами данных (SQL Server, Oracle, MySQL) и поддерживает как подключенный, так и отключенный режимы работы .
2. Исторический экскурс в технологии доступа к данным.
Эволюция технологий доступа:
· DAO (Data Access Objects): Первая технология для доступа к базам данных.
· RDO (Remote Data Objects): Для доступа к удаленным источникам.
· ADO (ActiveX Data Objects): Универсальная технология на основе COM, которая работала в подключенном режиме через объект Recordset .
· ADO.NET: Пришла на смену ADO, представив модель с отключенным набором данных (DataSet) и поддержкой XML, что стало прорывом для n-уровневых приложений .
3. Сравнительный анализ технологий доступа к данным.
· DAO: Хороша для локальных баз (Access), но медленная и небезопасная для удаленных.
· RDO: Оптимизирована для удаленных SQL Server через ODBC.
· ADO: Универсальна, работала с любыми источниками через OLE DB.
· ADO.NET: Предназначена для современных приложений. Ключевое отличие — отключенный режим (DataSet), поддержка XML и строгая типизация . Вместо единого объекта Recordset использует DataReader (быстрый, только вперед) и DataSet (гибкий, офлайн) .
4. Сравнительный анализ понятий драйвер и провайдер.
Это разные уровни абстракции :
· Драйвер: Низкоуровневая системная библиотека (напр., ODBC Driver), напрямую общается с СУБД.
· Провайдер (Data Provider): Набор управляемых классов в .NET (напр., SqlConnection), использующих драйвер для общения с БД. Обеспечивает единый интерфейс для разработчика .
5. Пространства ADO.NET.
Основные пространства имен:
· System.Data: Базовые классы (DataTable, DataSet).
· System.Data.Common: Базовые классы провайдеров (DbConnection).
· System.Data.SqlClient: Провайдер для SQL Server.
· System.Data.OleDb: Провайдер для OLE DB.
· System.Data.Odbc: Провайдер для ODBC.
· System.Data.SqlLite и др. для других СУБД.
6. Режимы работы ADO.NET.
· Присоединенный (Connected): Постоянное открытое соединение с БД. Используется для быстрых операций и потокового чтения через DataReader .
· Отсоединенный (Disconnected): Соединение открывается только на время загрузки/сохранения данных. Сама работа ведется с локальной копией (DataSet), что снижает нагрузку на сервер .
7. Концепция интерфейсов и базовых классов ADO.NET.
Архитектура построена на абстракции для универсальности:
· Базовые классы: DbConnection, DbCommand, DbDataReader содержат общую логику .
· Интерфейсы: IDbConnection, IDbCommand, IDataReader определяют контракт для всех провайдеров .
· Реализация (потомки): Для каждой СУБД создаются наследники, реализующие конкретный протокол (напр., SqlConnection) .
8. Обзорный пример использования ADO.NET.
Типичный алгоритм:
1. Создать соединение (DbConnection).
2. Открыть его.
3. Создать команду (DbCommand) с SQL-запросом.
4. Выполнить команду: получить DbDataReader для запросов (SELECT) или ExecuteNonQuery для вставки/обновления .
5. Обработать результаты.
6. Закрыть соединение.
---
Присоединенный режим
9. Класс DbConnection. Цели и задачи.
Отвечает за подключение к БД. Предоставляет строку подключения, методы Open()/Close() и управление транзакциями (через BeginTransaction) . Потомки: SqlConnection, OleDbConnection.
10. Класс DbCommand. Цели и задачи.
Представляет SQL-запрос или хранимую процедуру. Отвечает за выполнение команд. Ключевые свойства: CommandText (текст SQL), CommandType (Text/StoredProcedure), Connection. Методы: ExecuteReader(), ExecuteNonQuery(), ExecuteScalar() .
11. Класс DbDataReader. Цели и задачи.
Быстрый, однонаправленный поток данных. Используется в присоединенном режиме для чтения только вперед . Потомки: SqlDataReader. Данные через него нельзя изменять .
12. Примеры вставки, обновления, удаления данных.
Выполняются через DbCommand.ExecuteNonQuery() :
```csharp
// Вставка
command.CommandText = "INSERT INTO Users (Name) VALUES ('Иван')";
int rowsAffected = command.ExecuteNonQuery();
// Обновление
command.CommandText = "UPDATE Users SET Name='Петр' WHERE Id=1";
// Удаление
command.CommandText = "DELETE FROM Users WHERE Id=1";
```
Метод возвращает количество затронутых строк .
13. Использование параметров. Класс DbParameter.
Предотвращает SQL-инъекции и упрощает работу с типами. Параметры добавляются в коллекцию Parameters команды . Синтаксис зависит от провайдера: для SQL Server — @Name, для OLE DB/ODBC — ? .
14. Использование транзакций. Класс DbTransaction.
Для группировки операций как единого целого (ACID). Транзакция создается через DbConnection.BeginTransaction() и привязывается к команде . Завершается Commit() (успех) или Rollback() (откат).
---
Фабрика провайдеров, асинхронность, конфигурация
15. Фабрика провайдеров ADO.NET.
Паттерн для создания провайдера во время выполнения без жесткой привязки к типу. Класс DbProviderFactory создает все необходимые объекты: CreateConnection(), CreateCommand() и т.д. . Получить фабрику можно через DbProviderFactories.GetFactory(providerName) .
16. Асинхронные механизмы доступа к данным.
Позволяют не блокировать поток UI при длительных операциях с БД. Методы с суффиксом Async: OpenAsync(), ExecuteReaderAsync(), ExecuteNonQueryAsync() . Используются с await в асинхронных методах для повышения отзывчивости приложений.
17. Использование конфигурационных файлов.
Строки подключения и имя провайдера хранятся в app.config/web.config. Обычно в секции connectionStrings. Это позволяет изменять настройки без перекомпиляции приложения.
---
Отсоединенный режим
18. Что такое отсоединенный режим?
Режим работы, при котором приложение работает с данными в памяти (DataSet), периодически синхронизируя их с БД . Соединение открывается лишь на время загрузки (Fill) или сохранения (Update) .
19. Концепция использования отсоединенного режима.
Используется для сложной многоступенчатой обработки данных (редактирование в UI, расчеты, агрегации) без постоянной нагрузки на сервер. Все изменения отслеживаются автоматически .
20. Что такое DataSet?
Отключенный кэш данных в памяти. Это "мини-база данных" внутри приложения, содержащая коллекцию DataTable, отношения между ними (DataRelation) и ограничения . Хранит не только данные, но и информацию об изменениях для последующей синхронизации .
21. Класс DataTable.
Представляет одну таблицу данных в памяти . Состоит из коллекций DataColumn (схема) и DataRow (данные) .
22. Класс DataRow.
Представляет отдельную запись (строку) в DataTable . Позволяет читать и изменять данные по имени столбца. Отслеживает свое состояние (RowState): Added, Modified, Deleted .
23. Класс DataColumn.
Определяет схему столбца в DataTable: имя, тип данных, ограничения (напр., Primary Key) .
24. Класс DbDataAdapter.
"Мост" между БД и DataSet. Использует команды SelectCommand, InsertCommand, UpdateCommand, DeleteCommand. Метод Fill() загружает данные в DataSet, а Update() сохраняет изменения обратно в БД .
25. Класс SqlCommandBuilder.
Вспомогательный класс, который автоматически генерирует команды INSERT, UPDATE, DELETE для DataAdapter на основе SelectCommand . Упрощает код, но имеет ограничения и снижает производительность.
---
LINQ to SQL
26. Что такое LINQ to SQL?
Легковесный ORM-инструмент от Microsoft, позволяющий работать с SQL Server через строго типизированные объекты C# . Превращает SQL-запросы в LINQ-выражения.
27. Цели и задачи LINQ to SQL.
Основная цель — упростить доступ к данным, убрав необходимость писать SQL-строки. Задачи: автоматическая генерация классов для таблиц БД ("Database First"), проверка запросов на этапе компиляции, отслеживание изменений объектов .
28. Схема работы LINQ to SQL.
Создается DataContext — основной объект для работы с БД. Через него выполняются LINQ-запросы, транслируемые в SQL. Изменения объектов фиксируются вызовом SubmitChanges() .
29. Фильтрация данных.
Выполняется с помощью оператора Where в LINQ:
```csharp
var activeUsers = db.Users.Where(u => u.IsActive == true).ToList();
```
30. Сортировка данных.
Используются операторы OrderBy/OrderByDescending:
```csharp
var sortedUsers = db.Users.OrderBy(u => u.LastName).ToList();
```
31. Группировка данных.
Оператор GroupBy для группировки наборов (напр., подсчет клиентов по городам):
```csharp
var cityGroups = db.Customers.GroupBy(c => c.City);
```
32. Вложенные запросы.
LINQ позволяет создавать сложные запросы, которые транслируются в EXISTS, IN или JOIN. Реализуются через вложенные from или where с условиями.
33. Объединения (join).
Оператор Join для соединения таблиц по ключу:
```csharp
var orders = db.Orders.Join(db.Customers, o => o.CustomerId, c => c.Id, (o, c) => new { o, c });
```
34-36. Обновление, вставка, удаление данных.
Выполняется через манипуляции с объектами :
· Вставка: db.Table.InsertOnSubmit(newObject).
· Удаление: db.Table.DeleteOnSubmit(objectToDelete).
· Обновление: Прямое изменение свойств объекта.
Все изменения фиксируются в БД вызовом db.SubmitChanges().
---
Введение в Entity Framework
37. Что такое Entity Framework?
Мощный ORM-фреймворк от Microsoft. Это "наследник" LINQ to SQL, спроектированный для сложных корпоративных приложений . Поддерживает множество СУБД и различные подходы к проектированию.
38. Цели и задачи Entity Framework.
Основная цель — полностью абстрагировать разработчика от структуры БД и SQL. Задачи: работа с данными через объекты предметной области, поддержка наследования, сложных связей и различных баз данных, автоматическая миграция схемы .
39. Понятие модели.
Модель — это описание структуры данных в терминах предметной области (классы C#), их связей и правил. В EF она независима от структуры таблиц БД благодаря маппингу .
40. Понятие сгенерированного кода.
Код (Entity-классы), который создается автоматически на основе модели (при DB/Model First) для использования в программе . В Code First разработчик создает классы вручную.
41. Обзор различных подходов при работе с EF.
· Database First: База данных создается вручную, по ней генерируется модель и код .
· Model First: Сначала создается визуальная модель, по ней генерируются БД и код .
· Code First: Сначала пишутся классы предметной области (C#), по ним автоматически создается БД (миграции) .
42. Использование Code First.
Самый популярный подход, обеспечивающий полный контроль над кодом. Создаются классы ("domain classes"), а EF на основе их свойств и атрибутов генерирует схему БД . Изменения в модели применяются через миграции, сохраняя данные.