在DataSet中訪問多個表

ADO.Net模型有一個很大的優點,就是DataSet對象可以跟蹤多個表和它們之間的關係。這表示可以在一個操作的不同程序段之間傳遞完整的相關數據集,體系結構內在地維護數據之間關係的完整性。

ADO.Net中的DataRelation對象用於描述DataSet中的多個DataTables對象之間的關係。每個DataSet都包含DataRelations的Relations集合,以查找和操縱相關表。DataSet的Relations屬性是一個DataRelation對象的集合,DataRelation對象表示這個DataSet之間表之間的關係。要創建一個新的DataRelation,可以使用Relations的Add()方法,該方法接收表示關係的字符串名和兩個DataColumn(父列後跟子列)。比如:要創建Customers表的CustomerID列和Orders表的CustomerID列之間的關係 ,應使用下面的語法,把它們的關係命名爲CustOrders。

DataRelation custOrderRel = ds.Relations.Add("CustOrders", ds.Tables["Customers"].Columns["CustomerID"], ds.Tables["Orders"].Columns["CustomerID"]);
爲了使用有關係,需要從一張表的行進入另一張表的關聯行,這就是對關係導航。通常導航是指從一張表的父行進入另一張表的子行。那麼假如給定父表中的一行,如何獲取子表中與其對應的所有行呢?我們可以使用DataRow對象的GetChildRows()方法提取這些行。示例:一個顧客(Customers)表包含有一個或多個訂單(Orders)表,建立這兩個表之間的數據並提取數據的代碼如下。
static void Main(string[] args)
        {
            string connStr = @"Data Source=.\SQLEXPRESS; AttachDbFilename='C:\SQL Sever 2000 Sample Databases\NORTHWND.MDF';Integrated Security=True;User Instance=true";
            SqlConnection conn = new SqlConnection(connStr);
            conn.Open();
            //創建用於保存修改的數據的適配器
            SqlDataAdapter adapter = new SqlDataAdapter("select CustomerID,CompanyName from Customers", conn);
            SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
            //創建數據集
            DataSet ds = new DataSet();
            //創建讀取Customers表的適配器
            SqlDataAdapter custAdapter = new SqlDataAdapter("select * from Customers", conn);
            //創建讀取Orders表的適配器
            SqlDataAdapter orderAdapter = new SqlDataAdapter("select * from Orders", conn);
            //填充兩個表的數據並放到DataSet中
            custAdapter.Fill(ds, "Customers");
            orderAdapter.Fill(ds, "Orders");
            //創建兩個表之間的關係
            DataRelation custOrderRel = ds.Relations.Add("CustOrders", ds.Tables["Customers"].Columns["CustomerID"], ds.Tables["Orders"].Columns["CustomerID"]);
            foreach (DataRow custRow in ds.Tables["Customers"].Rows)
            {
                Console.WriteLine("Customer ID: " + custRow["CustomerID"] + "\tName: " + custRow["CompanyName"]);
                foreach (DataRow orderRow in custRow.GetChildRows(custOrderRel))
                {
                    Console.WriteLine(" Order ID: "+orderRow["OrderID"]);
                }
            }
            conn.Close();

            Console.ReadKey();

        }
利用兩個表之間的關係訪問表中的數據的時候,我們還可以使用Linq over DataSet 。這需要導入System.Data.Linq命名空間。我們可以使用如下代碼代替上述代碼中的foreach部分:
            var preferredCustomers = from c in Customers
                                     where c.GetChildRows("CustOrders").Length > 10
                                     orderby c.GetChildRows("CustOrders").Length
                                     select c;
            Console.WriteLine("Customers with > 10 orders:");
            foreach (var customer in preferredCustomers)
            {
                Console.WriteLine("{0} orders: {1} {2}, {3} {4}",customer.GetChildRows("CustOrders").Length,
                    customer["CustomerID"],customer["CompanyName"],customer["City"],customer["Region"]);
            }

表之間的關係除了兩個表之間的關係,還有更復雜的多表連接。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章