- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Обработка баз данных на Visual Basic®.NET - Джеффри Мак-Манус
Шрифт:
Интервал:
Закладка:
РИС. 6.1. Схема работы объекта DataAdapter — как моста между источником данных и объектом DataSet
Основными методами объекта DataAdapter являются Fill и Update. Метод Fill наполняет объект DataAdapter данными, полученными от источника данных, а метод Update обновляет источник данных в соответствии с изменениями данных в таблицах объекта DataSet.
Объект DataAdapter содержит набор из четырех свойств (Select Command, InsertCommand, UpdateCommand и DeleteCommand), которые являются объектами ADO.NET типа Command, конфигурированными для выполнения одноименных операций. Например, объект SelectCommand выполняется при вызове метода Fill объекта DataAdapter, а остальные объекты выполняются для каждой измененной записи при вызове метода Update объекта DataAdapter. Разработчики базы данных обладают полным контролем над этими командами, которые позволяют настраивать команды, используемые для операций вставки, обновления и удаления.
Наконец, коллекция TableMappings объектов DataTableMapping позволяет указать соответствие между таблицей источника данных и объектом DataTable.
Передача данных из источника данных в объект DataSet
Для использования объекта DataAdapter требуется, как минимум, подключение к базе данных и команда Select. Для этого можно использовать объекты Connection и Command, т.е. создать их, конфигурировать и присвоить их свойствам Connection и SelectCommand объекта DataAdapter. Однако гораздо удобнее использовать для этого конструктор объекта DataAdapter с двумя строковыми параметрами: один для команды SELECT, а второй для строки подключения, как показано ниже.
Dim da As SqlDataAdapter = New SqlDataAdapter( _
"select * from tblDepartment" _
"server=localhost;uid=sa;database=Novelty")
НА ЗАМЕТКУУчтите, что указанная в объекте SelectCommand команда SQL может иметь параметры. В главе 4, "Модель ADO.NET: провайдеры данных", приводятся основные сведения об определении этих параметров для разных провайдеров данных .NET.
Попробуем теперь вызвать метод Fill для извлечения данных из базы данных Novelty и загрузки их в объект DataSet. Для этого вернитесь к проекту DataSetCode из главы 5, "ADO.NET: объект DataSet", и выполните перечисленные ниже действия.
1. Щелкните правой кнопкой мыши на проекте DataSetCode в окне Solution Explorer и выберите в контекстном меню команду Properties, чтобы открыть диалоговое окно DataSetCode Property Pages.
2. Выберите раздел General в папке Common Properties в правой части диалогового окна DataSetCode Property Pages, а затем выберите форму frmDataSets в поле Startup object.
3. Откройте форму frmDataSets в окне конструктора формы.
4. Создайте новую кнопку непосредственно под кнопкой Constraints, перетаскивая ее из панели элементов управления.
5. В окне свойств Properties укажите значение btnDataAdapterFill для свойства (Name) и значение DataAdapter Fill для свойства Text.
6. Для использования провайдера данных SqlClient нужно импортировать его пространство имен с помощью команды, отмеченной полужирным начертанием в следующем фрагменте кода:
Imports System
Imports System.Data
Imports System.Data.SqlClient
7. Вставьте код, показанный в листинге 6.1.
Листинг 6.1. Использование провайдера данных SqlClient для вставки данных В Набор данных dsEmployeeInfоPrivate Sub btnDataAdapterFill_Click(ByVal sender As _
System.Object, ByVal e As System.EventArgs) _
Handles btnDataAdapterFill.Click
ReadData()
End Sub
Private Sub ReadData()
Dim rows As Integer
Dim daDepartments As SqlDataAdapter = New SqlDataAdapter( _
"select * from tblDepartment", _
"server=localhost;uid=sa;database=novelty")
dsEmployeeInfo = New DataSet()
rows = daDepartments.Fill(dsEmployeeInfo, "Departments")
DisplayDataSet(dsEmployeeInfo)
End Sub
После создания объекта daDepartments с двумя аргументами, которые содержат команду Select и строку подключения, вызывается метод Fill для наполнения данными таблицы Departments набора данных dsEmployeeInfo. Метод Fill также возвращает количество записей, которые включены (или обновлены) в набор данных dsEmployeeInfo. При выполнении метода Fill провайдером данных неявно выполняются перечисленные ниже действия.
• Для объекта SelectCommand открывается подключение к источнику данных, если оно еще не открыто.
• Выполняется команда, указанная в свойстве CommandText объекта SelectCommand (вместе с параметрами, если таковые имеются).
• Создается объект DataReader для возвращения имен полей и типов, использованных для создания нового объекта DataTable в указанном наборе данных DataSet, если этого объекта еще не существует.
• Объект DataReader используется для извлечения данных и вставки их в таблицу.
• Объект DataReader закрывается.
• Подключение к источнику данных закрывается, если оно было открыто объектом DataReader, в противном случае оно остается открытым.
НА ЗАМЕТКУПри выполнении одной команды по отношению к источнику данных обычно проще и эффективнее создавать объекты Command и Connection неявно при создании объекта DataAdapter. Однако при выполнении нескольких команд по отношению к одному источнику данных эффективнее создать объект Connection явно и затем присвоить его объекту DataAdapter. Это позволяет поддерживать подключение постоянно открытым без часто повторяющихся операций его открытия и закрытия, что снижает производительность. Эквивалентный код представлен ниже.
Private Sub ReadData()
Dim rows As Integer
Dim daDepartments As SqlDataAdapter
Dim соnn As New SqlConnection (_
"server=localhost;uid=sa;database=novelty")
Dim cmdSelect As New SqlCommand(_
"select * from tblDepartment")
dsEmployeeInfо = New DataSet()
cmdSelect.Connection = conn
daDepartments.SelectCommand = cmdSelect
' Открытие подключения перед выполнением команд
conn.Open()
rows = daDepartments.Fill(dsEpmloyeeInfo, "Departments")
' Выполнение операций с базой данных.
' ...
DisplayDataSet(dsEmployeeInfо)
' Закрытие подключения после выполнения всех команд.
conn.Close()
End Sub
Конечно, для эффективного использования явно созданных объектов conn и cmdSelect желательно, чтобы количество операций с базой данных было достаточно большим.
Методу Fill передается ссылка на набор данных dsEmployeeInfo и имя таблицы Departments, в которую вставляются данные. Вместо имени таблицы можно было бы передать ссылку на объект DataTable. Еще один вариант указания параметров основан на передаче только ссылки на объект DataSet, а метод Fill в таком случае по умолчанию загрузит данные в объект DataTable по имени Table.
НА ЗАМЕТКУОбычно для вставки данных в объект DataTable используется объект DataSet, однако существует перегруженная версия метода Fill для загрузки данных в отдельный объект DataTable.
Для загрузки данных во вторую таблицу можно создать второй объект DataAdapter с другой командой Select. В данном примере для загрузки данных в таблицы Department и Employees из соответствующих таблиц базы данных нужно использовать приведенный ниже код для подпрограммы ReadData() вместо кода из листинга 6.1.
Private Sub ReadData()
Dim rows As Integer
Dim daDepartments As SqlDataAdapter = New SqlDataAdapter(_
"select * from tblDepartment", _
"server=localhost;uid=sa;database=novelty")
Dim daEmployees As SqlDataAdapter = New SqlDataAdapter(_
"select * from tblEmployee", _
"server=localhost;uid=sa;database=novelty")
dsEmployeeInfo = New DataSet()
rows = daDepartments.Fill(dsEmployeeInfo, "Departments")
rows = daEmployees.Fill(dsEmployeeInfo, "Employees")
DisplayDataSet(dsEmployeeInfo)
End Sub
Скомпонуйте проект DataSetCode, щелкните на кнопке DataAdapter Fill, и в поле со списком, как и прежде, будет отображена информация о содержании набора данных dsEmployeeInfo, но теперь она извлекается из базы данных под управлением SQL Server, а не генерируется локально кодом приложения.
Для установления родительско-дочерних связей между записями в этих таблицах можно создать объект DataRelation, который служит отношением между ними.
НА ЗАМЕТКУИногда предпочтительнее вставлять в объект DataSet результаты объединения двух таблиц. В таком случае потребуется только один объект DataTable и не понадобится создавать отношение между двумя исходными таблицами. Однако использовать две отдельные таблицы можно более гибко, особенно при обновлении источника данных, потому что обновление объединенной таблицы связано с некоторыми ограничениями, в то время как для обновления независимых таблиц никаких ограничений не существует.
Совсем необязательно использовать разные объекты DataAdapter для таблиц одного набора данных. Иногда для них можно использовать один объект DataAdapter, только изменяя параметр с текстом команды SQL. Этот способ прекрасно подходит для многочисленных вызовов метода Fill, так как программирование всех отдельных операций создания и изменения команд обновления (вставки, обновления и удаления) каждого объекта DataTable в соответствии с изменениями источника данных требует много времени и усилий.
Итак, для использования одного объекта DataAdapter предыдущий код следует заменить приведенным ниже.

