DataTable 核心結構
- Columns:
DataColumnCollection,定義欄位名稱、型別、約束
- Rows:
DataRowCollection,實際資料列
- Constraints:唯一性、外鍵等約束
- DefaultView:
DataView,提供篩選、排序、搜尋功能
常用建構子
var dt = new DataTable(); // 無名稱
var dt = new DataTable("Table_AX"); // 指定名稱
var dt = new DataTable("Table_AX", "ns"); // 指定名稱與命名空間
實用操作速查表
1. 動態建立結構與資料
DataTable dt = new DataTable("Table_AX");
// 加欄位:方法 1
dt.Columns.Add("column0", typeof(string));
// 加欄位:方法 2
DataColumn dc = new DataColumn("column1", typeof(bool));
dt.Columns.Add(dc);
// 加資料列
DataRow dr = dt.NewRow();
dr["column0"] = "AX";
dr["column1"] = true;
dt.Rows.Add(dr);
// 直接加入未初始化的列 (欄位值為 DBNull)
dt.Rows.Add(dt.NewRow());
2. 查詢與篩選
// Select 回傳 DataRow[],支援類 SQL WHERE 條件
DataRow[] rows = dt.Select("column1 IS NULL"); // 找 NULL
DataRow[] rows2 = dt.Select("column0 = 'AX'"); // 字串比對
DataRow[] rows3 = dt.Select("column1 = true", "column0 DESC"); // 含排序
3. 複製與結構複製
DataTable dtWithData = dt.Copy(); // 含結構 + 資料
DataTable dtSchemaOnly = dt.Clone(); // 僅結構 (含約束)
4. 列操作四種寫法
DataRow r = dt.Rows[0];
// 1. 欄位名稱索引
r["column0"] = "AXzhz";
// 2. 序號索引
r[0] = "AXzhz";
// 3. 直接透過 Rows 集合
dt.Rows[0]["column0"] = "AXzhz";
// 4. 雙重索引
dt.Rows[0][0] = "AXzhz";
5. 跨 DataTable 複製列
dtSchemaOnly.Rows.Add(dt.Rows[0].ItemArray); // 以陣列形式複製值
6. 序列化為 XML 字串
public string DataTableToXml(DataTable dt)
{
if (string.IsNullOrEmpty(dt.TableName)) dt.TableName = "Table_AX";
using (var sw = new StringWriter())
using (var xw = new XmlTextWriter(sw))
{
dt.WriteXml(xw);
dt.WriteXmlSchema(xw); // 包含結構描述
return sw.ToString();
}
}
public DataTable XmlToDataTable(string xml)
{
// XML 格式:先資料後結構描述 (兩段 )
int idx = xml.IndexOf("
7. DataView 篩選、排序並轉回 DataTable
dt.DefaultView.RowFilter = "column1 <> true"; // 篩選
dt.DefaultView.Sort = "ID, Name ASC"; // 排序
DataTable sortedFiltered = dt.DefaultView.ToTable(); // 產生新 DataTable
8. 資料繫結 (GridView 等)
gvTestDataTable.DataSource = dt; // 實際繫結的是 DefaultView
gvTestDataTable.DataBind();
9. 判斷欄位是否存在
bool hasCol = dt.Columns.Contains("AX");
效能與記憶體提示
MinimumCapacity (預設 50) 可預設初始容量,大量資料時預先設定減少擴展開銷。
- 頻繁增刪列時,考慮使用
BeginLoadData()/EndLoadData() 暫停索引維護。
- 大資料集建議改用
SqlDataReader 串流處理,避免一次載入所有資料到記憶體。