C#中數量不定的`DataTable`動態創建,**切勿嘗試動態變量名(如`dt1`、`dt2`)**,應使用集合容器。本文對比`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];
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);
// 僅當多表結構相同且邏輯允許合併查詢時
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 |
| 表間有主外鍵關係、需XML Schema導出、維護舊ADO.NET代碼 | `DataSet` |
| 數據庫層面可合併查詢 | 單次查詢填充`DataSet`多表 |
// 定義實體
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僅作邊界數據交換層。