6.1.3 Работа с разъединёнными данными
Ранее, при использовании MySqlDataReader, соединение с базой данных поддерживалось постоянно, если его явно не закрывали. Также возможно работать таким образом, что соединение устанавливается только при необходимости. Например, в этом режиме можно установить соединение для чтения фрагмента данных, затем данные могут быть изменены приложением по необходимости. Соединение можно повторно установить только тогда, когда приложение запишет данные обратно в базу данных. Это разъединяет рабочие данные от базы данных.
Этот режим работы с данными поддерживается MySQL Connector/NET. Для работы этого метода задействованы несколько компонентов:
Набор данных (Data Set). Набор данных — это область, в которой данные загружаются для чтения или изменения. Создаётся объект типа
DataSet, который может хранить несколько таблиц данных.Адаптер данных (Data Adapter). Адаптер данных является интерфейсом между набором данных и самой базой данных. Адаптер данных отвечает за эффективное управление соединениями с базой данных, открытие и закрытие их по мере необходимости. Адаптер данных создаётся путём создания объекта класса
MySqlDataAdapter. Объект классаMySqlDataAdapterимеет два основных метода:Fill, который считывает данные в набор данных, иUpdate, который записывает данные из набора данных в базу данных.Построитель команд (Command Builder). Построитель команд — вспомогательный объект. Построитель команд работает совместно с адаптером данных. При создании объекта
MySqlDataAdapterему обычно задаётся исходное оператор SELECT. На основе этого оператора Построитель команд может выработать соответствующие операторы UPDATE, INSERT и DELETE, которые потребуются для обновления базы данных. Для создания Построителя команд создаётся объект классаMySqlCommandBuilder.
В следующих разделах каждое из этих классов описывается более подробно.
Создание объекта DataSet
Объект DataSet можно создать просто, как показано в следующем фрагменте кода:
DataSet dsCountry;
...
dsCountry = new DataSet();
Хотя этот код создаёт объект DataSet, он ещё не заполнен данными. Для этого нужен адаптер данных.
Создание объекта MySqlDataAdapter
Объект MySqlDataAdapter можно создать, как показано в следующем примере:
MySqlDataAdapter daCountry;
...
string sql = "SELECT Code, Name, HeadOfState FROM Country WHERE Continent='North America'";
daCountry = new MySqlDataAdapter (sql, conn);
Объекту MySqlDataAdapter передаётся SQL, определяющий данные для работы.
Создание объекта MySqlCommandBuilder
После создания MySqlDataAdapter необходимо сгенерировать дополнительные операторы, необходимые для вставки, обновления и удаления данных. Существует несколько способов сделать это, но в этом учебнике вы увидите, как это можно сделать наиболее просто с помощью MySqlCommandBuilder. Следующий фрагмент кода демонстрирует это:
MySqlCommandBuilder cb = new MySqlCommandBuilder(daCountry);
Объект MySqlDataAdapter передаётся в качестве параметра в построитель команд.
Заполнение набора данных
Для работы с данными из базы данных необходимо загрузить их в набор данных. Это одна из задач объекта MySqlDataAdapter, и выполняется методом Fill. Следующий пример кода иллюстрирует этот момент.
DataSet dsCountry;
...
dsCountry = new DataSet();
...
daCountry.Fill(dsCountry, "Country");
Метод Fill является методом MySqlDataAdapter, и адаптер данных знает, как установить соединение с базой данных и извлечь необходимые данные, а затем заполнить набор данных при вызове метода Fill. Второй параметр "Country" — это таблица в наборе данных, которую нужно обновить.
Обновление набора данных
Теперь данные в наборе данных могут быть изменены приложением по мере необходимости. В какой-то момент изменения данных необходимо будет записать обратно в базу данных. Это достигается методом MySqlDataAdapter, методом Update.
daCountry.Update(dsCountry, "Country");
Опять же, указывается набор данных и таблица в наборе данных для обновления.
Пример работы
Взаимодействие между классами DataSet, MySqlDataAdapter и MySqlCommandBuilder может быть немного запутанным, поэтому их работу, возможно, лучше всего проиллюстрировать рабочим кодом.
В этом примере данные из базы данных world считываются в элемент управления Data Grid View. Здесь данные можно просматривать и изменять, прежде чем нажать кнопку обновления. Кнопка обновления затем активирует код для записи изменений обратно в базу данных. Код использует принципы, описанные ранее. Приложение было создано с использованием Microsoft Visual Studio для размещения и создания элементов управления пользовательского интерфейса, но основной код, использующий ключевые классы, описанные ранее, показан в следующем примере кода и является переносимым.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data;
using MySql.Data.MySqlClient;
namespace WindowsFormsApplication5
{
public partial class Form1 : Form
{
MySqlDataAdapter daCountry;
DataSet dsCountry;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string connStr = "server=localhost;user=root;database=world;port=3306;password=******";
MySqlConnection conn = new MySqlConnection(connStr);
try
{
label2.Text = "Connecting to MySQL...";
string sql = "SELECT Code, Name, HeadOfState FROM Country WHERE Continent='North America'";
daCountry = new MySqlDataAdapter (sql, conn);
MySqlCommandBuilder cb = new MySqlCommandBuilder(daCountry);
dsCountry = new DataSet();
daCountry.Fill(dsCountry, "Country");
dataGridView1.DataSource = dsCountry;
dataGridView1.DataMember = "Country";
}
catch (Exception ex)
{
label2.Text = ex.ToString();
}
}
private void button1_Click(object sender, EventArgs e)
{
daCountry.Update(dsCountry, "Country");
label2.Text = "MySQL Database Updated!";
}
}
}
На следующей фигуре показано запущенное приложение. Приложение «База данных стран» обновило данные в трёх столбцах: Код, Название и Глава государства.
Рисунок 6.1 Приложение «База данных стран»
© 2025 Oracle
Licensed under the GPLv2 License.