Прайс Кевин Т.
Шрифт:
Наиболее эффективный способ загрузки данных из двух таблиц в объект DataSet основан на использовании объекта SelectCommand, который вызывает хранимую процедуру, возвращающую результирующий набор записей, или выполняет пакет команд SQL. В таком случае для извлечения данных требуется выполнить только одно обращение к серверу баз данных вместо многократного обращения, как в предыдущих примерах кода. Хотя этот способ упрощает и ускоряет извлечение данных из нескольких таблиц, при этом значительно усложняется обновление данных при их изменении в таблицах объекта DataSet, если между ними задано отношение. Этот способ обновления рассматривается более подробно в бизнес-ситуации 6.1 далее в главе.
В листинге 6.2 демонстрируется еще один способ использования одного объекта DataAdapter для выполнения нескольких операций вставки данных в один объект DataTable.
Обратите внимание, что в листинге 6.2 возвращаемое значение метода Fill уже не сохраняется в локальной переменной rows. Совсем необязательно сохранять возвращаемое значение, если только в дальнейшем не предполагается проверять его или использовать каким-то другим способом. Предлагаемый в листинге 6.2 код можно было бы расширить несколькими командами Select для обновления объекта DataTable наиболее свежими данными (например, измененными другими пользователями) из источника данных.
Существующие в объекте DataTable значения обновляются только при вызове соответствующего метода Fill, если для объекта DataTable задан первичный ключ. По умолчанию метод Fill вставляет в объект DataTable информацию о структуре данных и значения данных в записях без указания каких-либо ограничений, которые могут быть заданы в источнике данных. Для правильной установки значения свойства PrimaryKey (чтобы корректно выполнялись операции обновления данных и метод Fill) еще до вызова метода Fill нужно выполнить одно из следующих действий:
• вызвать метод FillSchema объекта DataAdapter;
• указать значение AddWithKey для свойства объекта DataAdapter;
• явно указать значение свойства PrimaryKey для соответствующих полей, если они известны в режиме создания приложения.
Обновление источника данных
Обычно после внесения всех необходимых изменений в таблицы набора данных DataSet потребуется сохранить эти изменения в источнике данных. Для этого нужно вызвать метод Update объекта DataAdapter, который анализирует изменения в указанной таблице набора данных (или сразу во всех таблицах, если ни одна из них не указана явно). Для каждой измененной записи по отношению к источнику данных выполняется команда вставки, обновления или удаления с помощью соответствующего объекта InsertCommand, UpdateCommand или DeleteCommand.
Возможность прямого указания специализированных пользовательских команд SQL или хранимых процедур в целях их автоматического применения для обновления источника данных при изменении данных в объекте DataSet является наиболее значительным усовершенствованием способа работы с данными в модели ADO.NET по сравнению с моделью ADO 2.X. В модели АDO.NET предусмотрено не только управление способом обновления пакета записей, но и использование хранимых процедур для выполнения этой задачи. Помимо указания команд SQL для операций обновления, применение хранимых процедур позволяет существенно повысить производительность и использовать специализированную бизнес-логику. Далее приводится краткий пример использования этих преимуществ. Кроме того, в отличие от модели ADO которая может применяться только к SQL-совместимым источникам данных, механизм пакетного обновления модели ADO.NET может работать даже с источниками данных, не совместимыми с SQL.
Каждая измененная запись обновляется отдельно, а не как часть транзакции или пакетной операции. Причем порядок обновления записей определяется порядком их расположения в объекте DataTable.
Для явного управления порядком выполнения операций для заданной таблицы можно использовать методы GetChanges или Select, которые доступны на уровне либо объекта DataSet, либо объекта DataTable. Эти методы используются для извлечения отдельных наборов записей с разными состояниями записей.
Допустим, необходимо обновить базу данных Novelty данными из объекта dsEmployees с помощью объекта daDepartments. Причем сначала требуется выполнить все вставки, затем все обновления, а потом все удаления. Это можно сделать, трижды вызывая метод GetChanges с указанием соответствующих разных состояний записей. После каждого вызова метода GetChanges вызывается метод Update объекта DataAdapter с передачей объекта DataTable, возвращенного методом GetChanges.