DataSet 是離線資料容器,新增 DataTable 後必須透過 SqlDataAdapter 的 InsertCommand / UpdateCommand 批次寫回資料庫。
using (SqlConnection conn = new SqlConnection(connStr))
using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Users", conn))
{
// 1. 建立命令建構器,自動產生 Insert/Update/DeleteCommand
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
// 2. 填充現有資料
DataSet ds = new DataSet();
adapter.Fill(ds, "Users");
// 3. 動態新增 DataTable(或直接在既有 Table 新增 Row)
DataTable newTable = new DataTable("Logs");
newTable.Columns.Add("Id", typeof(int));
newTable.Columns.Add("Msg", typeof(string));
newTable.Rows.Add(1, "System started");
ds.Tables.Add(newTable);
// 4. 針對新 Table 另建 Adapter 寫入
using (SqlDataAdapter logAdapter = new SqlDataAdapter("SELECT * FROM Logs WHERE 1=0", conn))
{
SqlCommandBuilder logBuilder = new SqlCommandBuilder(logAdapter);
logAdapter.Update(ds, "Logs"); // 批次寫入
}
}
Logs),或先執行 DDL 建表。SqlCommandBuilder 需要資料表有主鍵,否則無法自動產生 Update/Delete 指令。SqlBulkCopy 效能更佳。若專案允許,改用 EF Core context.Database.EnsureCreated() + context.AddRange() + SaveChanges(),語法更簡潔、強型別。