首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# DataSet 與 DataTable 完整操作指南:建立、查詢、修改、驗證與 XML 互轉

     編輯:關於C#

DataSet 與 DataTable 是 ADO.NET 離線資料架構的核心,支援多資料表、關聯、條件約束、資料檢視與 XML 序列化。本文系統整理從建立結構、填入資料、查詢修改、狀態追蹤、條件約束、XML 互轉到效能優化的完整操作模式,附大量可直接複製的代碼片段。

1. 建立與填入資料

手動建立結構

DataSet ds = new DataSet("MyDataSet");
DataTable dt = ds.Tables.Add("Customers");
dt.Columns.Add("CustomerID", typeof(string)).MaxLength = 5;
dt.Columns.Add("CompanyName", typeof(string));
dt.PrimaryKey = new[] { dt.Columns["CustomerID"] }; // 設定主鍵

// 自動遞增欄位
DataColumn idCol = dt.Columns.Add("OrderID", typeof(int));
idCol.AutoIncrement = true;
idCol.AutoIncrementSeed = -1;
idCol.AutoIncrementStep = -1;
idCol.ReadOnly = true;

// 運算欄位
dt.Columns.Add("ItemTotal", typeof(decimal), "Quantity * UnitPrice");

從資料庫填入

using (var da = new SqlDataAdapter("SELECT * FROM Orders", connStr))
{
    da.Fill(ds, "Orders"); // 自動建立 DataTable 並填入資料
}

2. 查詢與巡覽資料

// 取得第一個 DataTable
DataTable tbl = ds.Tables[0]; // 或 ds.Tables["Orders"]

// 列舉欄位名稱
foreach (DataColumn col in tbl.Columns)
    Console.WriteLine(col.ColumnName);

// 取得第一列資料
DataRow row = tbl.Rows[0];
Console.WriteLine(row["OrderID"]);

// 列舉該列所有欄位值
foreach (DataColumn col in tbl.Columns)
    Console.WriteLine(row[col]);

// 列舉所有列
foreach (DataRow r in tbl.Rows)
    DisplayRow(r);

3. 修改資料與狀態追蹤

新增列

DataRow newRow = tbl.NewRow();
newRow["CustomerID"] = "ALFKI";
newRow["CompanyName"] = "Alfreds";
tbl.Rows.Add(newRow);

// 或使用物件陣列
tbl.Rows.Add("ALFKI", "Alfreds", "Maria", "Berlin");

修改列(建議使用 BeginEdit/EndEdit 批次更新)

DataRow row = tbl.Rows.Find("ANTON");
if (row != null) {
    row.BeginEdit();
    row["CompanyName"] = "NewName";
    row["ContactName"] = "NewContact";
    row.EndEdit(); // 變更標記為 Modified
}

刪除列

DataRow row = tbl.Rows.Find("ALFKI");
row.Delete(); // 標記為 Deleted,實際移除需 AcceptChanges 或 DataAdapter.Update

RowState 狀態機

  • Detached:新建未加入集合
  • Added:已加入,未 AcceptChanges
  • Unchanged:已同步
  • Modified:已編輯
  • Deleted:已標記刪除

檢查掛起變更

row["CompanyName"] = "New";
Console.WriteLine(row["CompanyName", DataRowVersion.Current]); // New
Console.WriteLine(row["CompanyName", DataRowVersion.Original]); // Old

4. 條件約束

// Unique
dt.Columns["Email"].Unique = true;

// ForeignKey
DataTable parent = ds.Tables["Customers"];
DataTable child = ds.Tables["Orders"];
var fk = new ForeignKeyConstraint(parent.Columns["CustomerID"], child.Columns["CustomerID"]);
child.Constraints.Add(fk);

5. DataSet/DataTable 核心方法與屬性速查

類別常用成員說明
DataSetAcceptChanges()/RejectChanges()認可/放棄所有掛起變更
GetChanges()取得含變更列的新 DataSet(適合傳給 DataAdapter.Update)
Merge()合併另一 DataSet/DataTable/DataRow[]
ReadXml/WriteXmlXML 序列化
HasChanges是否有掛起變更
DataTableSelect(filter, sort)依條件篩選排序,回傳 DataRow[]
Compute(expr, filter)聚合運算(Sum, Count 等)
DefaultView取得 DataView 供排序/篩選/繫結
DataRowBeginEdit/EndEdit/CancelEdit批次編輯
ItemArray一次存取/設定所有欄位值

6. XML 互轉

// DataSet 寫入 XML(含結構描述)
ds.WriteXml("data.xml", XmlWriteMode.WriteSchema);

// 讀取 XML
DataSet ds2 = new DataSet();
ds2.ReadXml("data.xml");

7. 遍歷 DataSet 通用範本

foreach (DataTable dt in dataSet.Tables)
    foreach (DataRow dr in dt.Rows)
        foreach (DataColumn dc in dr.Table.Columns)
            Console.WriteLine($"{dc.ColumnName} = {dr[dc]}");

8. 效能與最佳實踐提醒

  • 大量資料優先使用 DataReader(唯讀、前向、低記憶體)。
  • DataTable.Select 會掃描全表,大量查詢建議建立 DataView 並設定 Sort/RowFilter。
  • 頻繁修改時,BeginEdit/EndEdit 減少事件觸發次數。
  • 跨層傳遞 DataSet 時,考慮 GetChanges() 只傳遞異動資料,降低頻寬。
  • Clone() 只複製結構,Copy() 連資料一起複製。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved