先前,使用 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);
會將指定要處理之資料的 SQL 提供給 MySqlDataAdapter
。
建立 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!";
}
}
}
下圖顯示了已啟動的應用程式。「世界資料庫應用程式」更新了三個欄位中的資料:代碼(Code)、名稱(Name)和國家元首(HeadOfState)。