• Создается объект 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 предыдущий код следует заменить приведенным ниже.
Читать дальше