Чтение онлайн

на главную - закладки

Жанры

Обработка баз данных на Visual Basic®.NET

Прайс Кевин Т.

Шрифт:

Методу 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 предыдущий код следует заменить приведенным ниже.

Private Sub ReadData

 Dim rows As Integer

 Dim da As SqlDataAdapter = New SqlDataAdapter( _

"select * from tblEmployee", _

"server=localhost;uid=sa;database=novelty")

 dsEmployeeInfo = New DataSet

 rows = da.Fill(dsEmployeeInfo, "Employees")

 ' Изменение текста
команды SQL.

 da.SelectCommand.CommandText = _

"select * from tblDepartment"

 rows = da.Fill(dsEmployeeInfo, "Departments")

 DisplayDataSet(dsEmployeeInfo)

End Sub

НА ЗАМЕТКУ

Наиболее эффективный способ загрузки данных из двух таблиц в объект DataSet основан на использовании объекта SelectCommand, который вызывает хранимую процедуру, возвращающую результирующий набор записей, или выполняет пакет команд SQL. В таком случае для извлечения данных требуется выполнить только одно обращение к серверу баз данных вместо многократного обращения, как в предыдущих примерах кода. Хотя этот способ упрощает и ускоряет извлечение данных из нескольких таблиц, при этом значительно усложняется обновление данных при их изменении в таблицах объекта DataSet, если между ними задано отношение. Этот способ обновления рассматривается более подробно в бизнес-ситуации 6.1 далее в главе.

В листинге 6.2 демонстрируется еще один способ использования одного объекта DataAdapter для выполнения нескольких операций вставки данных в один объект DataTable.

Листинг 6.2. Использование одного объекта DataAdapter для нескольких операций вставки данных в один объект DataTable

Private Sub ReadData

 Dim daEmployees As SqlDataAdapter = New SqlDataAdapter(_

"select * from tblEmployee where DepartmentID = 1", _

"server=localhost;uid=sa;database=novelty")

 dsEmployeeInfo = New DataSet

 daEmployees.Fill(dsEmployeeInfo, "Employees")

 ' Изменение текста команды SQL.

 daEmployees.SelectCommand.CommandText = _

"select * from tblEmployee where DepartmentID = 3"

 daEmployees.Fill(dsEmployeeInfo, "Employees")

 DisplayDataSet(dsEmployeeInfo)

End Sub

Обратите внимание, что в листинге 6.2 возвращаемое значение метода Fill уже не сохраняется в локальной переменной rows. Совсем необязательно сохранять возвращаемое значение, если только в дальнейшем не предполагается проверять его или использовать каким-то другим способом. Предлагаемый в листинге 6.2 код можно было бы расширить несколькими командами Select для обновления объекта DataTable наиболее свежими данными (например, измененными другими пользователями) из источника данных.

НА ЗАМЕТКУ

Существующие в объекте DataTable значения обновляются только при вызове соответствующего метода Fill, если для объекта DataTable задан первичный ключ. По умолчанию метод Fill вставляет в объект DataTable информацию о структуре данных и значения данных в записях без указания каких-либо ограничений, которые могут быть заданы в источнике данных. Для правильной установки значения свойства PrimaryKey (чтобы корректно выполнялись операции обновления данных и метод Fill) еще до вызова метода Fill нужно выполнить одно из следующих действий:

• вызвать метод FillSchema объекта DataAdapter;

• указать значение AddWithKey для свойства объекта DataAdapter;

• явно указать значение свойства PrimaryKey для соответствующих полей, если они известны в режиме создания приложения.

Поделиться:
Популярные книги

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Зубных дел мастер

Дроздов Анатолий Федорович
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Зубных дел мастер

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

Честное пионерское! Часть 3

Федин Андрей Анатольевич
3. Честное пионерское!
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Честное пионерское! Часть 3

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Страж. Тетралогия

Пехов Алексей Юрьевич
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Страж. Тетралогия

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Совершенный: охота

Vector
3. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Совершенный: охота

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Личник

Валериев Игорь
3. Ермак
Фантастика:
альтернативная история
6.33
рейтинг книги
Личник