在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"]);
            }

表之间的关系除了两个表之间的关系,还有更复杂的多表连接。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值