Заполнение наборов данных с помощью 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 взаимодействуют с базами данных и другими объектами в памяти:
Хотя 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 загружать различные результаты на основе различных критериев.
Например, если приложение содержит таблицу с именами клиентов, можно создать запрос, заполняющий таблицу каждым именем клиента, начинающимся с определенной буквы. Вы можете создать другой запрос, который включает в таблицу всех клиентов, находящихся в том же штате. Чтобы заполнить таблицу 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.UpdateAll method.Boolean . |
свойство tableNameTableAdapter |
Представляет TableAdapter. Созданный TableAdapterManager содержит свойство для каждого управляемого объекта TableAdapter . Например, набор данных с таблицей "Клиенты и заказы" создается с помощью TableAdapterManager, содержащего свойства CustomersTableAdapter и OrdersTableAdapter . |
свойство UpdateOrder |
Управляет порядком отдельных команд вставки, обновления и удаления. Задайте для этого свойства одно из значений перечисления TableAdapterManager.UpdateOrderOption .По умолчанию для UpdateOrder задано значение InsertUpdateDelete , что означает, что вставка, обновление и удаление выполняются для всех таблиц в наборе данных. |
Безопасность
При использовании команд данных с свойством CommandType
, установленным для Text, тщательно проверяйте данные, отправленные клиентом перед передачей в базу данных. Злоумышленники могут попытаться отправить (внедрить) измененные или дополнительные инструкции SQL, чтобы получить несанкционированный доступ к базе данных. Прежде чем передавать входные данные пользователя в базу данных, всегда убедитесь, что информация действительна. Рекомендуется использовать параметризованные запросы или хранимые процедуры, если это возможно.