Dim da As New SqlDataAdapter()
grdCustomersOrders.DataSource = Nothing
ds = New DataSet()
' Создание команды SELECT.
da.SelectCommand = New SqlCommand()
da.SelectCommand.Connection = cn
da.SelectCommand.CommandType = CommandType.Text
da.SelectCommand.CommandText = _
"select * from tblCustomer; select * from tblOrder"
' Указание информативных имен для таблиц.
da.TableMappings.Add("Table", "Customers")
da.TableMappings.Add("Table1", "Orders")
' Загрузка данных, da.Fill(ds)
' Создание отношения.
ds.Relations.Add("Customer_Orders", _
ds.Tables("Customers").Columns("ID"), _
ds.Tables("Orders").Columns("CustomerID"))
' Отображение данных.
grdCustomersOrders.DataSource = ds
End Sub
Private Sub btnUpdate_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnUpdate.Click
' Создание адаптеров данных.
Dim daCustomers As New SqlDataAdapter( _
"select * from tblCustomer", en)
Dim daOrders As New SqlDataAdapter( _
"select * from tblOrder", en)
Dim cbCustomers As New SqlCommandBuilder(daCustomers)
Dim cbOrders As New SqlCommandBuilder(daOrders)
Try
' Внесение изменений в таблицы в "правильном"
' порядке (см. далее в тексте).
Dim ChangedTable As New DataTable()
' Удаление записей в дочерней таблице.
ChangedTable = _
ds.Tables("Orders").GetChanges(DataRowState.Deleted)
If Not ChangedTable Is Nothing Then
daOrders.Update(ChangedTable)
End If
' Все измененные записи в родительской таблице.
ChangedTable = ds.Tables("Customers").GetChanges
If Not ChangedTable Is Nothing Then
daCustomers.Update(ChangedTable)
End If
' Новые или измененные записи в дочерней таблице.
ChangedTable = _
ds.Tables("Orders").GetChanges(DataRowState.Added _
Or DataRowState.Modified)
If Not ChangedTable Is Nothing Then
daOrders.Update(ChangedTable)
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Первая подпрограмма btnFill_Click считывает обе таблицы из базы данных посредством одного обращения к базе данных благодаря выполнению пакета команд SQL. В объекте CommandText отдельные команды пакета отделяются точкой с запятой.
Обратите внимание, что предлагаемые по умолчанию имена таблиц Table и Table1 в приведенных ниже строках кода отображаются на более информативные имена Customers и Orders.
' Указание информативных имен для таблиц.
da.TableMappings.Add("Table", "Customers")
da. TableMappings.Add("Table1", "Orders")
НА ЗАМЕТКУ
Более подробно способы отображения таблиц и полей рассматриваются в главе 7, "ADO.NET: дополнительные компоненты".
После вставки данных в набор данных ds между таблицами Customers и Orders создается отношение DataRelation, где Customers является родительской таблицей, a Orders — дочерней. Последняя строка кода в этой подпрограмме связывает набор данных DataSet с сеткой для отображения данных.
Вторая подпрограмма, btnUpdate_Click, вносит в базу данных изменения данных в объектах-таблицах с учетом родительско-дочерних связей между ними. К сожалению, ссылочная целостность данных не поддерживается автоматически, а потому ее нужно организовать вручную. Для этого разработчику необходимо сгруппировать типы изменений, а затем выполнить их в правильном порядке. Для двух таблиц, между которыми существуют родительско-дочерние связи, изменения следует вносить в приведенном ниже порядке.
1. Сначала удалить записи в дочерней таблице.
2. Вставить, обновить и удалить записи в родительской таблице.
3. Вставить и обновить записи в дочерней таблице.
Для получения соответствующих изменений подпрограмма должна вызвать для данной таблицы метод GetChanges с фильтром состояния записи. Каждый вызов метода GetChanges возвращает объект DataTable только с измененными записями и заданным состоянием. Если таких записей нет, то возвращается значение Nothing. Если есть хотя бы одна измененная строка с заданным состоянием, то для фактического обновления базы данных вызывается метод Update объекта DataAdapter. Код этой подпрограммы окружен блоком операторов Try-Catch для обработки исключительных ситуаций, которые могут возникнуть в процессе обновления базы данных.
Скомпонуйте проект BusinessCase6 и проверьте полученное приложение, выполнив перечисленные ниже действия.
1. Запустите полученное приложение BusinessCase6 и щелкните на кнопке Fill. Это приведет к вставке данных в объект DataSet из базы данных Novelty. Однако строка кода
grdCustomersOrders.DataSource = ds
связывает с сеткой весь объект DataSet, а не какую-то одну таблицу DataTable. Поэтому сетка содержит раскрывающийся список таблиц возле кнопки с изображением знака "плюс", как показано на рис. 6.5.
РИС. 6.5. Исходный вид формы frmCustomersOrders после вставки данных в объект DataSet
Читать дальше