以前,在使用 MySqlDataReader
时,除非显式关闭,否则与数据库的连接会一直保持。也可以采用仅在需要时才建立连接的方式工作。例如,在此模式下,可以建立连接以读取一部分数据,然后应用程序可以根据需要修改数据。只有当应用程序将数据写回数据库时,才需要重新建立连接。这将工作数据集与数据库解耦。
MySQL Connector/NET 支持这种使用数据的解耦模式。有几个部分可以让这种方法发挥作用
数据集。数据集是加载数据以读取或修改数据的区域。实例化了一个
DataSet
对象,它可以存储多个数据表。数据适配器。数据适配器是数据集和数据库本身之间的接口。数据适配器负责有效地管理与数据库的连接,根据需要打开和关闭它们。数据适配器是通过实例化
MySqlDataAdapter
类的对象来创建的。MySqlDataAdapter
对象有两个主要方法:Fill
,用于将数据读取到数据集中;Update
,用于将数据从数据集写入数据库。命令生成器。命令生成器是一个支持对象。命令生成器与数据适配器一起工作。创建
MySqlDataAdapter
对象时,通常会为其提供一个初始 SELECT 语句。根据此SELECT
语句,命令生成器可以算出更新数据库所需的相应INSERT
、UPDATE
和DELETE
语句。要创建命令生成器,请创建一个MySqlCommandBuilder
类的对象。
其余部分将更详细地描述每个类。
可以简单地创建一个 DataSet
对象,如以下代码片段所示
DataSet dsCountry;
...
dsCountry = new DataSet();
尽管这会创建 DataSet
对象,但尚未向其中填充数据。为此,需要一个数据适配器。
可以创建 MySqlDataAdapter
,如下例所示
MySqlDataAdapter daCountry;
...
string sql = "SELECT Code, Name, HeadOfState FROM Country WHERE Continent='North America'";
daCountry = new MySqlDataAdapter (sql, conn);
MySqlDataAdapter
被赋予指定要处理数据的 SQL。
创建 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
数据库中的数据被读入数据网格视图控件。在这里,可以在单击更新按钮之前查看和更改数据。然后,更新按钮激活代码以将更改写回数据库。该代码使用了前面解释的原理。该应用程序是使用 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!";
}
}
}
下图显示了启动的应用程序。世界数据库应用程序更新了三列数据:代码、名称和国家元首。