Как создать связь между таблица в DataSet?

Wise

Green Team
19.01.2018
32
11
BIT
0
Создание связи между таблицами в DataSet

В этой статье показано, как создать связь между двумя таблицами в объекте DataSet при работе с базой данной Mysql в автономном режиме.

И так, предположим, что у нас есть база данных Mysql, которая содержит две таблицы: customers (клиенты) и orders (заказы).

Таблица customers содержит две колонки:

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY первичный ключ name VARCHAR(30) имя клиента

kak-peredat-dannye-mezhdu-formami-v-c_1.png


Таблица orders содержит три колонки:

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY первичный ключ customerID INT NOT NULL внешний ключ amount DOUBLE цена заказа

kak-dobavit-xml-fajl-v-solution-explorer_2.png


Создадим новый проект типа Windows Forms Application.

Добавим на форму три элемента управления DataGridView (dgvCustomers, dgvOrders, dgvCustomerOrders) и кнопку (Button).

kak-dobavit-xml-fajl-v-solution-explorer_1.png


С базой данных Mysql мы будем работать в автономном режиме, поэтому для начала поместим её копию в объект DataSet.

Для этого создадим новый метод InitializeDataSet:
Код:
private DataSet InitializeDataSet()
{
DataSet ds = new DataSet("CustomersOrders");
MySqlConnectionStringBuilder mysqlCSB = new MySqlConnectionStringBuilder();
mysqlCSB.Server = "ip адрес или название сервера";
mysqlCSB.Database = "название БД";
mysqlCSB.UserID = "пользователь БД";
mysqlCSB.Password = "пароль";
using (MySqlConnection con = new MySqlConnection(mysqlCSB.ConnectionString))
{
string query1 = "SELECT * FROM customers";
string query2 = "SELECT * FROM orders";
using (MySqlDataAdapter customerAdapter = new MySqlDataAdapter(query1, con))
{
customerAdapter.Fill(ds, "Customers");
}
using (MySqlDataAdapter orderAdapter = new MySqlDataAdapter(query2, con))
{
orderAdapter.Fill(ds, "Orders");
}
}
//создаём и добавляем новую связь
ds.Relations.Add("RelCustomersOrders",
ds.Tables["Customers"].Columns["id"],
ds.Tables["Orders"].Columns["customerID"]);
return ds;
}
С помощью метода Fill в объекте DataSet создаются две таблицы (Customers и Orders), которые заполняются данными из базы данных Mysql с помощью указанных sql запросов SELECT.

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

С помощью метода Add создаётся новая связь между таблицами: Customers и Orders, которая затем добавляется в коллекцию связей представленную свойством Relations объекта DataSet.

В данном примере метод InitializeDataSet будет выполняться с помощью нажатия кнопки (button1) расположенной на форме. Поэтому для начала подпишемся на событие Click, после чего в обработчике события button1_Click добавим следующий код:
Код:
private void button1_Click(object sender, EventArgs e)
{
DataSet ds = InitializeDataSet();
//Выводим содержимое таблиц в DataGridView
dgvCustomers.DataSource = ds.Tables["Customers"];
dgvOrders.DataSource = ds.Tables["Orders"];
}

atributy-xml-fajla_13.png


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

Давайте рассмотрим, как можно получить все заказы, например, для клиента в первой строке элемента управления DatagridView (dgvCustomers) используя ранее созданную связь между двумя таблицами в DataSet.

Создадим ещё один метод GetOrdersForFirstRow:
Код:
private DataTable GetOrdersForFirstRow(DataSet ds)
{
//создаём таблицу
DataTable dt = new DataTable("CustomerOrderRel");
dt.Columns.Add(new DataColumn("CustomerID", typeof(Int32)));
dt.Columns.Add(new DataColumn("Amount", typeof(Double)));
//получаем первую строку в dgvCustomers
DataRow row = ((DataRowView)dgvCustomers.Rows[0].DataBoundItem).Row;
//получаем дочерние строки используя связь
DataRow [] dr = row.GetChildRows(ds.Relations["RelCustomersOrders"]);
//добавляем дочерние строки в таблицу CustomerOrderRel
for (int i = 0; i < dr.Length; i++)
{
DataRow newRow = dt.NewRow();
newRow["CustomerID"] = dr[i]["customerID"];
newRow["Amount"] = dr[i]["amount"];
dt.Rows.Add(newRow);
}
return dt;
}
В методе GetOrdersForFirstRow сначала создаётся таблица CustomerOrderRel с двумя колонками: CustomerID (id клиента) и Amount (сумма заказа), содержимое которой будет выводиться в третий элемент DataGridView (dgvCustomerOrders).

Так как в данном примере содержимое в DataGridView и DataTable будет одинаковым, то получить первую строку можно, и просто напрямую обратившись к таблице Customers, например:
DataRow row = ds.Tables["Customers"].Rows[0];
Метод GetChildRows (в данном примере) позволяет получить все дочерние строки для первой строки в таблице Customers, с помощью созданной ранее связи между таблицами.

Осталось вывести полученные заказы для указанного клиента в элемент управления DatagridView (dgvCustomerOrders). Для этого в обработчике события button1_Click добавим буквально одну строку:
Код:
private void button1_Click(object sender, EventArgs e)
{
DataSet ds = InitializeDataSet();
dgvCustomers.DataSource = ds.Tables["Customers"];
dgvOrders.DataSource = ds.Tables["Orders"];
dgvCustomerOrders.DataSource = GetOrdersForFirstRow(ds);
}
atributy-xml-fajla_2.png
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!