文档主页
MySQL Connector/NET 开发人员指南
相关文档 下载本手册
PDF(US Ltr) - 1.3Mb
PDF(A4) - 1.3Mb


6.1.3 使用解耦数据

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

MySQL Connector/NET 支持这种使用数据的解耦模式。有几个部分可以让这种方法发挥作用

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

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

  • 命令生成器。命令生成器是一个支持对象。命令生成器与数据适配器一起工作。创建 MySqlDataAdapter 对象时,通常会为其提供一个初始 SELECT 语句。根据此 SELECT 语句,命令生成器可以算出更新数据库所需的相应 INSERTUPDATEDELETE 语句。要创建命令生成器,请创建一个 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");

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

工作示例

DataSetMySqlDataAdapterMySqlCommandBuilder 类之间的交互可能会有些混乱,因此它们的操作也许可以通过工作代码得到最好的说明。

在本例中,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!";
        }

    }
}

下图显示了启动的应用程序。世界数据库应用程序更新了三列数据:代码、名称和国家元首。

图 6.1 世界数据库应用程序

Content is described in the surrounding text.