При выполнении одной команды по отношению к источнику данных обычно проще и эффективнее создавать объекты 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, который служит отношением между ними.