以 Northwind 資料庫為例,建立型別化 DataSet DatasetOrders,包含三張表與關聯:
Customers (1) → (N) Orders (1) → (N) Order Details。
Orders.OrderID 為 Identity,設定 AutoIncrementSeed = -1、AutoIncrementStep = -1 避免衝突。
預存程序 GetCustomerOrdersInfo 回傳三個結果集:
SELECT CustomerID, CompanyName, ContactName FROM Customers WHERE CustomerID LIKE 'A%'
SELECT OrderID, OrderDate, CustomerID FROM Orders WHERE CustomerID IN (...)
SELECT OrderID, ProductID, UnitPrice, Quantity, Discount FROM [Order Details] WHERE OrderID IN (...)
C# 填充代碼:
public void FillCustomerOrdersInfo(DatasetOrders ds)
{
SqlCommand cmd = new SqlCommand("GetCustomerOrdersInfo", _conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.TableMappings.Add("Table", "Customers");
da.TableMappings.Add("Table1", "Orders");
da.TableMappings.Add("Table2", "Order Details");
da.Fill(ds);
}
或使用 SqlHelper.FillDataset(需修正 TableMapping 索引 Bug)。
ds.EnforceConstraints = false; // 關閉約束加速填充
dataGridCustomers.SetDataBinding(ds, ds.Customers.TableName);
dataGridOrders.SetDataBinding(ds, ds.Customers.TableName + "." + ds.Customers.ChildRelations[0].RelationName);
dataGridOrderDetails.SetDataBinding(ds, ds.Customers.TableName + "." + ds.Customers.ChildRelations[0].RelationName + "." + ds.Orders.ChildRelations[0].RelationName);
三個 DataGrid 將自動呈現主從關聯,點選客戶即顯示其訂單與明細。
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
SqlTransaction tx = conn.BeginTransaction();
try
{
SqlCommand cmd1 = new SqlCommand(sql1, conn, tx);
SqlCommand cmd2 = new SqlCommand(sql2, conn, tx);
cmd1.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
tx.Commit();
}
catch
{
tx.Rollback();
throw;
}
}
確保跨表異動(如新增訂單+明細)原子性。