2012年2月8日 星期三

C# : 使用 DataSet 管理從 MySQL 查詢出來的資料

在【C# : 對 MySQL 查詢資料】一文中查詢多筆資料所使用到的 MySqlDataReader 會與資料庫建立持續性的連線,所以在查詢完資料後必須明確的 Close();有時候我們會使用多句不同的查詢語句查詢出資料並長時間交互使用資料內容,而且這些資料並不會馬上被更新或是不需要更新,那麼每次都重新查詢或是使這些 MySqlDataReader 都一直維持連線,好像怎麼樣都不是很理想,這時候我們就可以考慮使用 DataSet 建立資料塊。
首先,利用 MySqlDataAdapter 來查詢資料並為查出的資料定義一個名稱整塊填入 DataSet 中做為 DataTable,之後可以利用所定義的名稱從 DataSet 取出 DataTable 並在 DataTable 指定列及欄位取得所需要的資料;而且也可為 DataTable 新增、修改、刪除資料,最終再整理 MySQL 語句將結果更新回資料庫中,如此將可對資料庫避免一些不必要讀寫的次數。大致的用法如下...

//開啟連線
MySqlConnection conn = new MySqlConnection("server=127.0.0.1;user=root;database=test;port=3306;password=1111;");
conn.Open();

//建立 DataSet
DataSet dataSet = new DataSet();

//使用 MySqlDataAdapter 查詢資料,並將結果存回 DataSet 當做名為 test1 的 DataTable
string sql = "SELECT * FROM test_table1 WHERE 1";
MySqlDataAdapter dataAdapter1 = new MySqlDataAdapter(sql, conn);
dataAdapter1.Fill(dataSet, "test1");

//使用 MySqlDataAdapter 查詢資料,並將結果存回 DataSet 當做名為 test2 的 DataTable
dataAdapter2 = new MySqlDataAdapter("SELECT * FROM test_table2 WHERE 1", conn);
dataAdapter2.Fill(dataSet, "test2");

// test1 的 DataTable
DataTable dataTable = dataSet.Tables["test1"];

//列出 test1 的第 4 筆資料
Console.WriteLine("id={0} , name={1}", dataTable.Rows[3]["id"], DataTable.Rows[3]["name"]);

//列出 test1 的總筆數
Console.WriteLine("總筆數:{0}", dataTable.Rows.Count);

//逐筆列出 test1 的資料
foreach(DataRow row in dataTable.Rows){
Console.WriteLine("id={0},name={1}", row["id"], row["name"]);
}

//建立新一列的資料
DataRow newRow = dataTable.NewRow();
newRow["id"] = 999;
newRow["name"] = "testName999";

//在 test1 中新增一筆資料
dataTable.Rows.Add(newRow);

//刪除 test1 中的 第 4 筆資料
dataTable.Rows[3].Delete();

//修改 test1 中第 1 筆資料的 name 欄位內容
dataTable.Rows[0]["name"] = "newName";

//利用 MySqlCommandBuilder 使 dataAdapter1 能夠實行新增、修改、刪除
new MySqlCommandBuilder(dataAdapter1);

//將 test1 內容的變動更新回資料庫
dataAdapter1.Update(dataSet, "test1");



一個 DataSet 可以存放多個 DataTable,而每個 DataTable 資料的變更可以透過 MySqlDataAdapter 連接更新回資料庫,這樣可以很方便的管理多批資料,不過要特別注意的是複雜語句查出的資料可能會無法正確處理,如 JOIN、GROUP BY ... 等。

以上範例可以簡單的應用在 Windows Form 應用程式的 DataGridView ...

假設有的 DataGridView 實作為 dataGridView1,延續上面範例的 DataSet ...

//指定資料來源
dataGridView1.DataSource = dataSet;

//指定列出 test1 DataTable 內容
dataGridView1.DataMember = "test1";

這樣在顯示視窗的 DataGridView 內容就會依照 test1 DataTable 資料欄位將內容資料以列表的方式顯示出來,可以直接在列表中新增、修改、刪除資料,不過如果想將變更的內容更新回資料庫,可能就要再加一個按鈕,使它在點擊之後執行以下這兩句,才會更新,否則只是表單上表面看到的變動而已,資料庫並不會有任何更改。

new MySqlCommandBuilder(dataAdapter1);
dataAdapter1.Update(dataSet, "test1");