Поделиться через


Заполнение наборов данных с помощью TableAdapters в приложениях .NET Framework

Заметка

Наборы данных и связанные классы являются устаревшими технологиями .NET Framework с начала 2000-х годов, которые позволяют приложениям работать с данными в памяти, пока приложения отключены от базы данных. Технологии особенно полезны для приложений, которые позволяют пользователям изменять данные и сохранять изменения обратно в базу данных. Хотя наборы данных как технология оказались очень успешными, мы рекомендуем, чтобы новые приложения .NET использовали Entity Framework Core. Entity Framework предоставляет более естественный способ работы с табличными данными в виде объектных моделей, и он имеет более простой интерфейс программирования.

Компонент TableAdapter заполняет набор данных данными из базы данных на основе одного или нескольких запросов или хранимых процедур, указанных вами. TableAdapters также может выполнять добавления, обновления и удаления в базе данных для сохранения изменений, внесенных в набор данных. Кроме того, вы можете выдавать глобальные команды, которые не связаны с какой-либо конкретной таблицей.

Заметка

Конструкторы Visual Studio создают TableAdapters. Если вы создаете наборы данных программным способом, используйте класс DataAdapter .NET.

Для получения подробных сведений об операциях TableAdapter вы можете сразу перейти к одной из следующих статей:

Статья Описание
Создание и настройка TableAdapters Узнайте, как использовать конструкторы для создания и настройки TableAdapters.
Создание параметризованных запросов TableAdapter Узнайте, как разрешить пользователям предоставлять аргументы процедурам или запросам TableAdapter.
Получите прямой доступ к базе данных с помощью TableAdapter Узнайте, как использовать методы TableAdapters DbDirect.
Отключить ограничения при заполнении набора данных Узнайте, как работать с ограничениями внешнего ключа при обновлении данных.
Расширение функциональности TableAdapter Узнайте, как добавить пользовательский код в TableAdapters.
Считать XML-данные в набор данных Узнайте, как работать с XML-данными в наборе данных.

Обзор TableAdapter

TableAdapters — это созданные конструктором компоненты, которые подключаются к базе данных, выполняют запросы или хранимые процедуры и заполняют их DataTable возвращаемыми данными. TableAdapters также отправляет обновленные данные из приложения обратно в базу данных. Вы можете выполнять столько запросов, сколько требуется для TableAdapter, если он возвращает данные, соответствующие схеме связанной таблицы. На следующей схеме показано, как TableAdapters взаимодействуют с базами данных и другими объектами в памяти:

схема, показывающая поток данных TableAdapter в клиентском приложении.

Хотя TableAdapters разработаны с помощью конструктора наборов данных, классы TableAdapter не создаются как вложенные классы DataSet. Вместо этого они находятся в отдельных пространствах имен, относящихся к каждому набору данных. Например, если у вас есть набор данных с именем NorthwindDataSet, TableAdapters, связанные с объектами DataTable в NorthwindDataSet, находятся в пространстве имен NorthwindDataSetTableAdapters. Чтобы получить доступ к определенному tableAdapter программным способом, объявите новый экземпляр класса TableAdapter. Например:

NorthwindDataSet northwindDataSet = new NorthwindDataSet();

NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter = 
    new NorthwindDataSetTableAdapters.CustomersTableAdapter();

customersTableAdapter.Fill(northwindDataSet.Customers);

Ассоциированная схема DataTable

При создании TableAdapter используйте начальный запрос или хранимую процедуру для определения схемы TableAdapter, связанного с DataTable. Выполните этот начальный запрос или хранимую процедуру, вызвав метод Fill TableAdapter, который заполняет связанные DataTableTableAdapter. Все изменения, внесенные в основной запрос TableAdapter, отражаются в схеме связанной таблицы данных. Например, если удалить столбец из основного запроса, конструктор наборов данных также удаляет столбец из связанной таблицы данных. Если какие-либо дополнительные запросы в TableAdapter используют инструкции SQL, возвращающие столбцы, не входящие в основной запрос, конструктор наборов данных пытается синхронизировать изменения столбцов между основным запросом и дополнительными запросами.

Команды обновления TableAdapter

Функции обновления TableAdapter зависят от того, сколько сведений доступно в основном запросе в мастере TableAdapter. Например, TableAdapters, настроенные для получения значений из нескольких таблиц (с помощью JOIN), скалярных значений, представлений или результатов агрегатных функций, изначально не создаются с возможностью отправки обновлений обратно в базовую базу данных. Однако можно настроить свойства InsertCommand, UpdateCommandи DeleteCommand вручную в Properties окне.

Запросы TableAdapter

TableAdapters может содержать несколько запросов для заполнения связанных таблиц данных. Вы можете определить столько запросов для TableAdapter, сколько требуется для приложения, если каждый запрос возвращает данные, соответствующие той же схеме, что и связанная с ней таблица данных. Эта возможность позволяет TableAdapter загружать различные результаты на основе различных критериев.

Диаграмма, на которой показан TableAdapter с несколькими запросами.

Например, если приложение содержит таблицу с именами клиентов, можно создать запрос, заполняющий таблицу каждым именем клиента, начинающимся с определенной буквы. Вы можете создать другой запрос, который включает в таблицу всех клиентов, находящихся в том же штате. Чтобы заполнить таблицу Customers клиентами в заданном состоянии, создайте запрос FillByState, который принимает параметр для значения состояния следующим образом: SELECT * FROM Customers WHERE State = @State. Запустите запрос, вызвав метод FillByState и передав значение параметра, например CustomerTableAdapter.FillByState("WA").

Помимо добавления запросов, возвращающих данные той же схемы, что и таблица данных TableAdapter, можно добавлять запросы, возвращающие скалярные (одно) значения. Например, запрос, возвращающий количество клиентов (SELECT Count(*) From Customers) является допустимым для CustomersTableAdapter, даже если возвращаемые данные не соответствуют схеме таблицы.

Свойство ClearBeforeFill

По умолчанию при каждом запуске запроса для заполнения таблицы данных TableAdapter существующие данные очищаются, а результаты запроса загружаются только в таблицу. Если вы хотите добавить или объединить данные, возвращаемые запросом к существующим данным в таблице данных, задайте для свойства tableAdapter ClearBeforeFill значение false. Независимо от того, очищаете ли данные, необходимо явно отправлять обновления в базу данных, если вы хотите сохранить их. Поэтому перед выполнением другого запроса, заполняющего таблицу, необходимо сохранить все изменения данных в таблице. Дополнительные сведения см. в разделе Обновление данных с помощьюTableAdapter.

Наследование TableAdapter

TableAdapters расширяет функциональные возможности стандартных адаптеров данных, инкапсулируя настроенный класс DataAdapter. По умолчанию TableAdapter наследует от класса Component и не может быть приведён к классу DataAdapter. Приведение TableAdapter к классу DataAdapter приводит к ошибке InvalidCastException. Чтобы изменить базовый класс TableAdapter, укажите класс, производный от класса Component в свойстве базового класса tableAdapter в конструкторе наборов данных.

Методы и свойства TableAdapter

Класс TableAdapter не является типом .NET, что означает, что его невозможно найти в браузере объектов или справочной документации. Visual Studio создает его на этапе проектирования при использовании одного из описанных ранее мастеров. Имя, которое Visual Studio назначает создаваемому объекту TableAdapter, основано на имени таблицы, с которым вы работаете. Например, при создании TableAdapter на основе таблицы в базе данных с именем Ordersимя TableAdapter называется OrdersTableAdapter. Чтобы изменить имя класса TableAdapter, используйте свойство имени в окне "Свойства" конструктора наборов данных.

Часто используемые методы и свойства TableAdapter приведены следующим образом:

Член Описание
TableAdapter.Fill Заполняет связанную таблицу данных TableAdapter результатами SELECT команды TableAdapter.
TableAdapter.Update Отправляет изменения обратно в базу данных и возвращает целое число, представляющее количество строк, затронутых обновлением. Дополнительные сведения см. в разделе Обновление данных с помощью TableAdapter.
TableAdapter.GetData Возвращает новый DataTable, заполненный данными.
TableAdapter.Insert Создает новую строку в таблице данных. Дополнительные сведения см. в разделе Вставка новых записей в базу данных.
TableAdapter.ClearBeforeFill Определяет, очищается ли таблица данных перед вызовом одного из методов Fill.

Метод обновления TableAdapter

TableAdapters используют команды данных для чтения и записи из базы данных. Используйте исходный запрос Fill (main) TableAdapter в качестве основы для создания схемы связанной таблицы данных, а также команд InsertCommand, UpdateCommandи DeleteCommand, связанных с методом TableAdapter.Update. При вызове метода Update TableAdapter выполняются инструкции, созданные при первоначальной настройке TableAdapter, и не выполняет один из дополнительных запросов, добавленных с помощью мастера настройки запросов TableAdapter .

При использовании TableAdapter он эффективно выполняет те же операции с командами, которые вы обычно выполняете. Например, при вызове метода Fill адаптера, адаптер запускает команду данных в своем свойстве SelectCommand и использует средство чтения данных (например, SqlDataReader) для загрузки результирующего набора в таблицу данных. Аналогичным образом при вызове метода Update адаптера выполняется соответствующая команда (в UpdateCommand, InsertCommandи свойствах DeleteCommand) для каждой измененной записи в таблице данных.

Заметка

Если основной запрос содержит достаточно сведений, конструктор создает InsertCommand, UpdateCommandи команды DeleteCommand по умолчанию, когда конструктор создает TableAdapter. Однако если основной запрос объекта TableAdapter выходит за рамки одной инструкции с таблицей SELECT, конструктор может не создать эти команды. В таком случае при запуске метода TableAdapter.Update может возникнуть ошибка.

Адаптер таблицы GenerateDbDirectMethods

Помимо InsertCommand, UpdateCommandи DeleteCommand, TableAdapters создаются со следующими методами, которые можно запускать непосредственно в базе данных: TableAdapter.Insert, TableAdapter.Updateи TableAdapter.Delete. Эти методы можно вызывать непосредственно для управления данными в базе данных. Это означает, что вы можете вызвать эти отдельные методы из вашего кода вместо вызова TableAdapter.Update для обработки вставок, обновлений и удалений, которые ожидают выполнения для соответствующей таблицы данных.

Если вы не хотите создавать эти прямые методы, задайте для свойства GenerateDbDirectMethods TableAdapter значение False в окне Properties. Дополнительные запросы, добавленные в TableAdapter, являются автономными запросами, которые не создают эти методы.

Поддержка TableAdapter для типов, принимающих значение NULL

TableAdapters поддерживают типы, допускающие значение NULL: Nullable<T> и T?. Для получения дополнительной информации о типах значений, допускающих NULL в Visual Basic, см. Nullable value types (Visual Basic). Дополнительные сведения о типах, допускающих значение NULL в C#, см. в типов значений, допускающих значение NULL (C#).

Ссылка на TableAdapterManager

По умолчанию Visual Studio создает класс TableAdapterManager при создании набора данных, содержащего связанные таблицы. Чтобы предотвратить создание класса, измените значение свойства Hierarchical Update набора данных на false. При перетаскивании таблицы, которая имеет отношение к области конструктора страницы Windows Form или WPF, Visual Studio объявляет переменную члена класса. Если вы не используете привязку данных, необходимо вручную объявить переменную.

Так как класс TableAdapterManager не является типом .NET, он не отображается в справочной документации. Visual Studio создает его во время разработки в рамках процесса создания набора данных.

В следующей таблице перечислены часто используемые методы и свойства класса TableAdapterManager:

Член Описание
метод UpdateAll Сохраняет все данные из всех таблиц данных.
свойство BackUpDataSetBeforeUpdate Определяет, следует ли создавать резервную копию набора данных перед выполнением TableAdapterManager.UpdateAllmethod.Boolean.
свойство tableNameTableAdapter Представляет TableAdapter. Созданный TableAdapterManager содержит свойство для каждого управляемого объекта TableAdapter. Например, набор данных с таблицей "Клиенты и заказы" создается с помощью TableAdapterManager, содержащего свойства CustomersTableAdapter и OrdersTableAdapter.
свойство UpdateOrder Управляет порядком отдельных команд вставки, обновления и удаления. Задайте для этого свойства одно из значений перечисления TableAdapterManager.UpdateOrderOption.

По умолчанию для UpdateOrder задано значение InsertUpdateDelete, что означает, что вставка, обновление и удаление выполняются для всех таблиц в наборе данных.

Безопасность

При использовании команд данных с свойством CommandType, установленным для Text, тщательно проверяйте данные, отправленные клиентом перед передачей в базу данных. Злоумышленники могут попытаться отправить (внедрить) измененные или дополнительные инструкции SQL, чтобы получить несанкционированный доступ к базе данных. Прежде чем передавать входные данные пользователя в базу данных, всегда убедитесь, что информация действительна. Рекомендуется использовать параметризованные запросы или хранимые процедуры, если это возможно.