Иногда предпочтительнее вставлять в объект 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.
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