DataSet 由 DataTable(表) 與 Relations(關聯) 組成。DataTable 內含:
DataSet ds = new DataSet();
DataTable tb1 = new DataTable("table1");
DataTable tb2 = new DataTable("table2");
ds.Tables.Add(tb1); ds.Tables.Add(tb2);
// table1:id, name
tb1.Columns.Add("id", typeof(int));
tb1.Columns.Add("name", typeof(string));
tb1.Rows.Add(1, "張三");
tb1.Rows.Add(2, "李四");
// table2:table1_id, sex
tb2.Columns.Add("table1_id", typeof(int));
tb2.Columns.Add("sex", typeof(string));
tb2.Rows.Add(1, "男");
GridView1.DataSource = ds.Tables["table1"].DefaultView;
GridView2.DataSource = ds.Tables["table2"].DefaultView;
UniqueConstraint uc = new UniqueConstraint("unique", ds.Tables["table1"].Columns["id"]);
ds.Tables["table1"].Constraints.Add(uc);
設定後,id 欄位值不可重複。嘗試修改為既有值會拋出例外:「列 'id' 被約束為是唯一的。值 '2' 已存在。」
ForeignKeyConstraint fk = new ForeignKeyConstraint("fk",
ds.Tables["table1"].Columns["id"], ds.Tables["table2"].Columns["table1_id"]);
ds.Tables["table2"].Constraints.Add(fk);
設定後,修改 table1 的 id 值,table2 的 table1_id 會自動跟著變更,維護參考完整性。
ds.Tables["table1"].Rows[0][0] = 3; // 修改第 0 列第 0 欄
// 或 ds.Tables["table1"].Rows[0]["id"] = 3;
ds.Tables["table1"].DefaultView 是 DataTable 自動建立的預設視圖。直接繫結 ds.Tables["table1"] 也可運作,因 GridView 內建視圖能力。但若需自訂排序/篩選,應操作明確的 DataView 實例並繫結該實例。
DataSet 關聯關係如何應用?SqlDataAdapter 如何高效填充 DataSet?請見下一篇「ADO.NET 實戰進階(三):DataView 與關聯關係」。