Similar presentations:
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
database