Модели соединения
Введение
DataTable и DataAdapter
Подключенная и отсоединенная модели
Подключенная и отсоединенная модели
Подключенная и отсоединенная модели
Обратно к DataTable
Обратно к DataTable
Важный момент
Практическое задание 1
Update()
CommandBuilder
CommandBuilder
Практическое задание 2
CommandBuilder
530.44K
Category: databasedatabase

3. Режимы работы (3)

1. Модели соединения

2. Введение

До этого момента работа строилась по подключенной модели.
Программа открывала соединение, выполняла команду, читала результат
и сразу завершала работу с объектами доступа к данным. Такой подход
подходит для ExecuteScalar(), ExecuteReader() и ExecuteNonQuery(),
когда приложение действует последовательно и не хранит набор строк
как самостоятельную структуру.
Существует и другой вариант. Можно получить данные из базы,
поместить их в объект DataTable, изменить их уже в памяти, а затем
одной операцией передать накопленные изменения обратно в источник
данных. За такую схему отвечает связка DataTable + DataAdapter. Она
называется отсоединенной моделью работы с данными.

3. DataTable и DataAdapter

DataTable представляет собой таблицу в памяти: со столбцами,
строками, типами значений и состоянием каждой строки.
DataAdapter служит мостом между этой таблицей и реальной базой
данных. Он умеет загрузить данные методом Fill(), а затем
применить изменения методом Update(). CommandBuilder может
автоматически сгенерировать команды INSERT, UPDATE и
DELETE для простых сценариев.
Эта модель полезна там, где нужно временно держать
редактируемый набор записей, менять его локально и отправлять
изменения пакетно.

4. Подключенная и отсоединенная модели

Подключенная модель означает, что приложение работает с потоком
данных прямо во время чтения из базы. Типичный пример – DataReader.
Пока читаются строки, соединение остается открытым. Памяти тратится
мало, скорость высокая, но редактировать данные в такой модели
неудобно.
Отсоединённая модель работает иначе. База данных используется как
источник для начальной загрузки и как место финальной записи
изменений. Между этими двумя точками приложение оперирует
локальной структурой DataTable. Это похоже на ситуацию, когда
пользователь сначала загружает справочник целиком, потом редактирует
несколько строк в форме, а затем нажимает кнопку сохранения.

5. Подключенная и отсоединенная модели

6. Подключенная и отсоединенная модели

DataTable напоминает обычную таблицу из БД, но существует
только внутри процесса. В ней есть коллекция Columns, коллекция
Rows, типы столбцов, значения по ячейкам и служебная
информация. Для каждой строки хранится RowState: Added,
Modified, Deleted, Unchanged или Detached. Именно это состояние
потом использует DataAdapter при вызове Update().

7. Обратно к DataTable

Для DataTable нужно
добавить using
System.Data;

8. Обратно к DataTable

DataAdapter строится вокруг команд. У него есть SelectCommand, а при
необходимости также InsertCommand, UpdateCommand и DeleteCommand. Метод
Fill() выполняет выборку и загружает результат в DataTable. После
редактирования вызывается Update(), и адаптер проходит по строкам таблицы,
анализируя их RowState.

9. Важный момент

Fill() создает «отпечаток» базы данных в моменте вызова. Если в самой БД
произойдут изменения, код об этом не узнает автоматически.
После Fill соединение можно закрывать

10. Практическое задание 1

1. Создайте новую базу данных – company.db.
Создайте таблицу Departments
2. Добавьте тестовые данные
3. Напишите программу, которая
1.
2.
3.
4.
Подключается к SQL
Создает SqlDataAdapter
Загружает Departments в DataTable
Выводит все строки в консоль
CREATE TABLE Departments (
Id INTEGER PRIMARY KEY,
Name TEXT NOT NULL);
INSERT INTO Departments (Name)
VALUES ('IT'),
('HR'),
('Sales');

11. Update()

Чтобы Update() смог отправить изменения обратно в БД, адаптеру нужны
команды INSERT, UPDATE и DELETE. Их можно написать вручную. Для
простых справочников допускается второй вариант – поручить создание
этих команд объекту CommandBuilder.

12. CommandBuilder

CommandBuilder анализирует SelectCommand адаптера и на основе
метаданных строит SQL для вставки, обновления и удаления. Этот
механизм работает только при определённых условиях.
• Запрос должен ссылаться на одну базовую таблицу.
• В выборке должен присутствовать ключ, по которому можно однозначно
определить строку.
• Чем проще SELECT, тем выше шанс, что команды будут сгенерированы
корректно.

13. CommandBuilder

Важно не путать генерацию команд с немедленным обновлением базы. CommandBuilder
только подготавливает команды для адаптера. Пока не вызван Update(), база данных не
меняется. Все правки продолжают жить внутри DataTable.

14. Практическое задание 2

1. После загрузки данных поменяйте название
отдела HR на Human Resources
2. Добавьте отдел Marketing и удалите отдел
Sales

15. CommandBuilder

English     Русский Rules