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

ADO.NET 多資料表操作實戰:DataSet 填充、關聯與交易

     編輯:C# 入門

場景與準備

以 Northwind 資料庫為例,建立型別化 DataSet DatasetOrders,包含三張表與關聯:
Customers (1) → (N) Orders (1) → (N) Order Details。
Orders.OrderID 為 Identity,設定 AutoIncrementSeed = -1、AutoIncrementStep = -1 避免衝突。

單一 DataAdapter 多結果集填充

預存程序 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)。

DataGrid 動態綁定關聯資料

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 將自動呈現主從關聯,點選客戶即顯示其訂單與明細。

多 Command 交易處理

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;
    }
}

確保跨表異動(如新增訂單+明細)原子性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved