首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C#動態創建多個DataTable:List與DataSet兩種方案對比

     編輯:程式設計綜合問答

C#中數量不定的`DataTable`動態創建,**切勿嘗試動態變量名(如`dt1`、`dt2`)**,應使用集合容器。本文對比`List`與`DataSet`兩種標準方案。

方案一:List(輕量、靈活、推薦)


List tableList = new List();

for (int i = 0; i < count; i++) {
    DataTable dt = GetPublicScore(i); // 你的獲取邏輯
    tableList.Add(dt);
}

// 後續使用
foreach (var dt in tableList) {
    // 處理每個表
    Console.WriteLine($"Table {tableList.IndexOf(dt)} Rows: {dt.Rows.Count}");
}

// 按索引訪問
DataTable thirdTable = tableList[2];
  • 優點:泛型類型安全、LINQ友好、序列化簡單、無DataSet額外開銷。
  • 適用:大多數業務邏輯處理、Web API返回、本地緩存。

方案二:DataSet(關聯數據、XML序列化、舊系統兼容)


DataSet ds = new DataSet("ScoreSet");

for (int i = 0; i < count; i++) {
    DataTable dt = GetPublicScore(i);
    dt.TableName = "Score_" + i; // 必須設置唯一表名
    ds.Tables.Add(dt);
}

// 關聯表之間關係(DataSet強項)
ds.Relations.Add("FK_Score_Detail", 
    ds.Tables["Score_0"].Columns["ID"], 
    ds.Tables["Score_1"].Columns["ParentID"]);

// XML序列化含Schema
string xml = ds.GetXml();
ds.WriteXml("scores.xml", XmlWriteMode.WriteSchema);
  • 優點:表間關係、約束、XML Schema內建支持、ADO.NET舊生態兼容。
  • 缺點:較重、API繁瑣、性能略低於List。

方案三:批量SQL一次查詢多結果集(數據庫層面優化)


// 僅當多表結構相同且邏輯允許合併查詢時
string sql = "SELECT * FROM Score_0; SELECT * FROM Score_1; SELECT * FROM Score_2;";
// 使用支持多結果集的驅動/方法
// SqlDataAdapter da = new SqlDataAdapter(sql, conn);
// DataSet ds = new DataSet();
// da.Fill(ds); // ds.Tables[0], [1], [2] 自動填充

選擇建議

場景推薦
純內存處理、Web API、現代.NET Core/5+`List` 或更佳:`List` (實體類)
表間有主外鍵關係、需XML Schema導出、維護舊ADO.NET代碼`DataSet`
數據庫層面可合併查詢單次查詢填充`DataSet`多表

進階建議:拋棄DataTable,擁抱強類型實體


// 定義實體
public class ScoreRecord {
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Score { get; set; }
}

// 查詢直接映射
List records = conn.Query("SELECT ...").ToList(); // Dapper
// 或 EF Core
var records = context.Scores.ToList();

// 處理極其簡潔、類型安全、重構友好
var highScores = records.Where(r => r.Score > 90).ToList();
核心原則:動態數量用集合,業務建模用實體類,DataTable/DataSet僅作邊界數據交換層。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved