Создание связи между таблицами в DataSet
В этой статье показано, как создать связь между двумя таблицами в объекте DataSet при работе с базой данной Mysql в автономном режиме.
И так, предположим, что у нас есть база данных Mysql, которая содержит две таблицы: customers (клиенты) и orders (заказы).
Таблица customers содержит две колонки:
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY первичный ключ name VARCHAR(30) имя клиента
Таблица orders содержит три колонки:
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY первичный ключ customerID INT NOT NULL внешний ключ amount DOUBLE цена заказа
Создадим новый проект типа Windows Forms Application.
Добавим на форму три элемента управления DataGridView (dgvCustomers, dgvOrders, dgvCustomerOrders) и кнопку (Button).
С базой данных Mysql мы будем работать в автономном режиме, поэтому для начала поместим её копию в объект DataSet.
Для этого создадим новый метод InitializeDataSet:
С помощью метода Fill в объекте DataSet создаются две таблицы (Customers и Orders), которые заполняются данными из базы данных Mysql с помощью указанных sql запросов SELECT.
При работе с адаптерами открывать соединение с базой данных не требуется.
С помощью метода Add создаётся новая связь между таблицами: Customers и Orders, которая затем добавляется в коллекцию связей представленную свойством Relations объекта DataSet.
В данном примере метод InitializeDataSet будет выполняться с помощью нажатия кнопки (button1) расположенной на форме. Поэтому для начала подпишемся на событие Click, после чего в обработчике события button1_Click добавим следующий код:
Теперь у нас есть копия базы данных, и мы можем работать с ней в автономном режиме.
Давайте рассмотрим, как можно получить все заказы, например, для клиента в первой строке элемента управления DatagridView (dgvCustomers) используя ранее созданную связь между двумя таблицами в DataSet.
Создадим ещё один метод GetOrdersForFirstRow:
В методе GetOrdersForFirstRow сначала создаётся таблица CustomerOrderRel с двумя колонками: CustomerID (id клиента) и Amount (сумма заказа), содержимое которой будет выводиться в третий элемент DataGridView (dgvCustomerOrders).
Так как в данном примере содержимое в DataGridView и DataTable будет одинаковым, то получить первую строку можно, и просто напрямую обратившись к таблице Customers, например:
Метод GetChildRows (в данном примере) позволяет получить все дочерние строки для первой строки в таблице Customers, с помощью созданной ранее связи между таблицами.
Осталось вывести полученные заказы для указанного клиента в элемент управления DatagridView (dgvCustomerOrders). Для этого в обработчике события button1_Click добавим буквально одну строку:
В этой статье показано, как создать связь между двумя таблицами в объекте DataSet при работе с базой данной Mysql в автономном режиме.
И так, предположим, что у нас есть база данных Mysql, которая содержит две таблицы: customers (клиенты) и orders (заказы).
Таблица customers содержит две колонки:
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY первичный ключ name VARCHAR(30) имя клиента
Таблица orders содержит три колонки:
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY первичный ключ customerID INT NOT NULL внешний ключ amount DOUBLE цена заказа
Создадим новый проект типа Windows Forms Application.
Добавим на форму три элемента управления DataGridView (dgvCustomers, dgvOrders, dgvCustomerOrders) и кнопку (Button).
С базой данных 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;
}
При работе с адаптерами открывать соединение с базой данных не требуется.
С помощью метода 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"];
}
Теперь у нас есть копия базы данных, и мы можем работать с ней в автономном режиме.
Давайте рассмотрим, как можно получить все заказы, например, для клиента в первой строке элемента управления 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;
}
Так как в данном примере содержимое в 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);
}