4.6.1.3 使用解耦数据

以前,在使用 时MySqlDataReader,与数据库的连接会一直保持,除非明确关闭。也可以以仅在需要时建立连接的方式工作。例如,在这种模式下,可以建立连接来读取数据块,然后应用程序可以根据需要修改数据。只有当应用程序将数据写回数据库时,才能重新建立连接。这将工作数据集与数据库分离。

MySQL Connector/NET 支持这种处理数据的解耦模式。允许此方法工作涉及几个部分:

  • 数据集。  数据集是加载数据以读取或修改数据的区域。实例化一个DataSet对象,可以存储多张表的数据。

  • 数据适配器。  数据适配器是数据集和数据库本身之间的接口。数据适配器负责有效地管理与数据库的连接,根据需要打开和关闭它们。数据适配器是通过实例化该类的一个对象来创建的 MySqlDataAdapter。该 MySqlDataAdapter对象有两个主要方法:Fill将数据读入数据集,以及Update将数据从数据集写入数据库。

  • 命令生成器。  命令生成器是一个支持对象。命令生成器与数据适配器一起工作。创建 MySqlDataAdapter对象时,通常会为其提供初始 SELECT 语句。从这个 SELECT语句中,Command Builder 可以计算出 更新数据库所需的相应的INSERT, UPDATE和 语句。DELETE要创建 Command Builder,需要创建该类的一个对象 MySqlCommandBuilder

其余部分更详细地描述了这些类中的每一个。

实例化数据集对象

可以简单地创建一个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是数据集中要更新的表。

更新数据集

Data Set 中的数据现在可以由应用程序根据需要进行操作。在某些时候,需要将对数据的更改写回数据库。这是通过一种MySqlDataAdapter方法实现的, Update方法。

daCountry.Update(dsCountry, "Country");

同样,指定要更新的数据集和数据集中的表。

工作示例

DataSetMySqlDataAdapter和 类 之间的交互MySqlCommandBuilder可能有点混乱,因此它们的操作可能最好通过工作代码来说明。

在此示例中,world数据库中的数据被读入数据网格视图控件。在这里,可以在单击更新按钮之前查看和更改数据。更新按钮然后激活代码以将更改写回数据库。该代码使用前面解释的原则。该应用程序是使用 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!";
        }

    }
}

下图显示了应用程序已启动。世界数据库应用程序更新了三列中的数据:代码、名称和州长。

图 4.1 世界数据库应用

内容在周围的文字中描述。