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

Бизнес-ситуация 7.1: просмотр данных из разных источников

Бизнес-ситуация 7.1: просмотр данных из разных источников

Когда компания Jones Novelties, Inc. приняла решение создать новую систему обработки данных, она уже имела прежнюю систему на основе базы данных Access, в которой директор компании Брэд Джонс хранил данные о заказах. Для директора очевидны преимущества перехода к новой системе на основе СУБД SQL Server, но прежде всего он хотел бы гарантировать сохранность унаследованных данных. Поэтому было решено вносить все изменения постепенно, особенно для сохранения данных компании запрошлые годы.

Итак, Джонс хотел бы создать новую систему на основе SQL Server, но иногда использовать старые данные из базы данных Access до тех пор, пока не будет закончена работа над новой системой. Поэтому часть данных должна храниться в одной базе данных, а часть — в другой. Две базы данных должны совместно использовать и даже объединять свои данные, хотя они относятся к разным типам баз данных.

К счастью, это требование легко удовлетворяется в модели ADO.NET. Как уже описывалось выше в главе, для объекта DataSet совершенно не имеет значения, откуда, т.е. из каких источников, берутся данные. Поэтому разработчик базы данных может создать приложение, загружая данные о заказах из таблицы tblOrder базы данных Access, а данные о клиентах — из таблицы 1 базы данных SQL Server. В дальнейшем, после создания в базе данных SQL Server таблицы tblOrder, достаточно будет только изменить строку подключения в объекте DataAdapter, и приложение будет функционировать, как и прежде.

Попробуем создать форму, которая демонстрирует описанный способ работы с данными из разных источников.

1. Запустите интегрированную среду разработки Visual Studio .NET.

2. Создайте новый проект Visual Basic Windows Application. Для этого в диалоговом окне New Project (Новый проект) выберите тип проекта Visual Basic Project в области Project Types (Типы проектов), а затем шаблон Windows Application (Приложение Windows) в области Templates (Шаблоны).

3. Назовите проект BusinessCase71.

4. Укажите путь к файлам проекта.

5. Увеличьте размер формы Form1.

6. В окне Properties укажите значение frmShowOrders для свойства (Name) и значение Show Orders для свойства Text формы Form1.

7. В верхнем левом углу формы создайте текстовое поле и укажите значение txtCustomerID для его свойства (Name), создайте кнопку и укажите значение btnFinds для ее свойства (Name) и значение Find для ее свойства Text, создайте поле со списком и укажите значение lstCustomer с для его свойства (Name). В правой части формы создайте сетку данных и укажите значение grdOrders для ее свойства (Name).

8. Расположите все эти элементы управления так, как показано на рис. 7.5.

9. Перетащите в форму из панели элементов управления компонент DataSet и укажите значение dsCustOrders для его свойства (Name).

10. Создайте новый объект SqlDataAdapter для таблицы tblCustomers базы данных Novelty СУБД SQL Server, перетаскивая его из панели элементов управления. После запуска программы-мастера DataAdapter Configuration Wizard выберите подключение к базе данных Novelty. Затем в диалоговом окне Choose a Query Туре выберите переключатель Use SQL statements.

11. В диалоговом окне Generate the SQL statements укажите команду SELECT * FROM tblCustomer для загрузки данных в объект — набор данных.

12. По окончании работы с программой-мастером DataAdapter Configuration Wizard укажите значение daCustomers для свойства (Name) для созданного объекта — адаптера данных. 


РИС. 7.5. Расположение элементов управления в форме frmShowOrders

13. Для таблицы tblOrder, которая находится в базе данных Novelty.MDB Access создайте объект OleDbDataAdapter, перетаскивая его из панели элементов управления. После запуска программы-мастера Data Adapter Configuration Wizard создайте новое подключение, щелкнув на кнопке New Connection. Затем в диалоговом окне Data Link Properties выберите вкладку Provider и провайдер Microsoft Jet 4.0 OLE DB Provider.

14. Затем выберите вкладку Connection и укажите путь к файлу базы данных Novelty.MDB.

15. Затем в диалоговом окне Choose a Query Type выберите переключатель Use SQL statements.

16. В диалоговом окне Generate the SQL statements укажите команду SELECT * FROM tblOrder для загрузки данных в объект — набор данных.

17. По окончании работы с программой-мастером Data Adapter Configuration Wizard укажите значение daOrders для свойства (Name) для созданного объекта — адаптера данных.

В верхней части файла введите следующий код:

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.OleDb

Затем в определении класса формы frmOrders введите код из листинга 7.7.

Листинг 7.7. Код объединения данных из источников данных разного типа

Private dvOrders As New DataView()
Private Sub frmShowOrders_Load(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles MyBase.Load
 Dim rel As DataRelation
 ' Вставка таблиц в набор данных
 dsCustOrders. daCustomers.Fill(dsCustOrders, "Customers")
 daOrders.Fill(dsCustOrders, "Orders")
 ' Создание отношения между таблицами.
 rel = dsCustOrders.Relations.Add("relCustOrders", _
  dsCustOrders.Tables("Customers").Columns("ID"), _
  dsCustOrders.Tables("Orders").Columns("CustomerID"))
 ' Указание первичного ключа для таблицы Customers.
 Dim pk(0) As DataColumn
 pk(0) = dsCustOrders.Tables("Customers").Columns("ID")
 dsCustOrders.Tables("Customers").PrimaryKey = pk
 ' Указание сортировки по умолчанию для метода Find.
 dsCustOrders.Tables("Customers").DefaultView.Sort = "ID"
End Sub
Private Sub btnFind_Click(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles btnFind.Click
 Dim RowNum As Integer
 Dim dvRow As DataRowView
 Dim i As Integer
 If IsNumeric(txtCistID.Text) Then
  RowNum = dsCustOrders.Tables("Customers"). _
  DefaultView.Find(txtCustID.Text)
  If RowNum <> -1 Then
   dvRow = dsCustOrders.Tables("Customers").DefaultView(RowNum)
   ' Вставка в поле со списком имен полей из таблицы Customer.
   lstCustomer.Items.Clear()
   For i = 0 To dsCustOrders.Tables("Customers").Columns.Count – 1
    lstCustomer.Items.Add(dvRow.Item(i))
   Next
   grdOrders.CaptionText = _
    "Orders for customer #" & txtCustID.Text
   ' Извлечение связанных дочерних записей для
   ' указанного клиента таблицы Customer.
   dvOrders = dvRow.CreateChild("relCustOrders")
   grdOrders.DataSource = dvOrders
  Else
   MessageBox.Show( _
    "CustomerID not found – Please try again.")
   ' "Клиент CustomerID не найден – Попробуйте еще раз."
   txtCustID.Clear()
  End If
 Else
  Beep()
 End If
End Sub

Все параметры источников данных задаются в подпрограмме frmShowOrders_Load. Затем создаются две таблицы для набора данных DataSet и отношение DataRelation между ними. Наконец, задаются значения свойств РrimaryKey и Sort для таблицы Customers и его представления по умолчанию DefaultView, чтобы для поиска записей можно было использовать метод Find.

Щелчок на кнопке Find приводит к выполнению нескольких операций, которые определены в коде подпрограммы btnFind_Click. После проверки числового типа значения в поле txtCustID начинается поиск этого значения в представлении DefaultView таблицы Customers. Если указанное значение найдено, то в поле со списком DataRowView будут показаны значения всех полей искомой записи с заданным идентификатором из таблицы Customers, а в сетке данных справа будут показаны ее дочерние записи из таблицы Orders.

Обратите внимание, что в данном примере создано отношение между двумя таблицами из баз данных совершенно разного типа!

Скомпонуйте проект BusinessCase7 и попробуйте найти родительскую запись в таблице Customers и ее дочерние записи из таблицы Orders, как показано на рис. 7.6.


РИС. 7.6. Пример представления результатов в форме frmShowOrders

НА ЗАМЕТКУ

Пусть вас не смущает, что сетка данных Orders (см. рис. 7.6) будет содержать поле с именем OrderAmount, а не поле Amount, как определено в таблице SQL Server. Дело в том, что данные о клиенте поступают из базы данных SQLServer, а данные о его заказах — из совершенно другой "унаследованной" базы данных Access типа MDB. Поэтому вполне естественно, что имена объектов в разных базах данных могут иметь различные имена.

Для исправления имени поля можно использовать приведенную ниже команду с предложением AS для изменения имени поля в данных, которые возвращаются для объекта daOrders с помощью команды SELECT.

SELECT CustomerID, ID, As Amount, OrderDate
FROM tblOrder

С течением времени необходимость комбинирования данных из разных источников будет расти, поскольку современные компании стремятся расширять круг своих партнеров и объединяются с другими компаниями, которые могут хранить и использовать свои бизнес-данные в совершенно разных форматах. В последнее время растет популярность формата XML, который позволяет очень просто и быстро переносить данные о заказах и продуктах между разными компаниями. Для объекта DataSet формат XML представляет собой еще один способ вставки данных в таблицы из разных источников данных. Более подробно способы вставки данных в объект DataSet в формате XML описываются в главе 10, "ADO.NET и XML".

Оглавление книги


Генерация: 1.518. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз