访问数据
填充好DataSet后,访问数据是再简单不过的一件事情。记住DataSet中的每个表都表示成一个DataTable对象,它是通过 DataSet的Tables集合来公开的。每个DataTable又包含一个由DataRow构成的集合,可对其进行索引,以获得特定行的数据。下面对上例进行扩展,假定你要将Customers表第一行、第一列的内容打印到控制台,可使用以下代码:
Console.WriteLine(ds.Tables[0].Rows[0][0]);
还可传递某个列的字符串索引,从而根据名称来获取不同的列。假定Customers表的第一列名为CustomerID,那么以下代码不仅能很好地工作,还更容易理解:
Console.WriteLine(ds.Tables[0].Rows[0][“CustomerID”]);
为使代码更清晰,甚至能从Rows集合提取一个DataRow,并直接访问它:
DataRow dr = ds.Tables[0].Rows[0];
Console.WriteLine(dr["CustomerID"]);
操作多个表
前面一直没有提及DataSet的一个非常有用的特性:它可表示来自多个表的数据。你可能已经注意到,以上代码是首先索引一个Tables集合,再访问其中的一个数据行。事实上,你可采取这种方式来访问多个DataTable,要么按索引,要么按名称。
要用多个DataTable来填充一个DataSet,可使用多个DataAdapter:
SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM Customers;",cn);
SqlDataAdapter sda2 = new SqlDataAdapter(“SELECT * FROM Products;”,cn);
DataSet ds = new DataSet();
sda.Fill(ds);
sda2.Fill(ds);
来自Customers的数据在ds.Tables集合的第一个DataTable中使用,Products数据则成为第二项。还可按名称来引用这些表。ADO.NET自动为每个DataTable指派常规名称。本例的Customers被命名为Table,Products被命名为 Table1。调用Fill方法时,可强行指定一个名称来覆盖这些默认名称,例如:
sda.Fill(ds,”Customers”);
sda2.Fill(ds,”Products”);
虽可使用多个DataAdapter,但效率堪忧,因为每个Fill方法都要连接一次数据库。如果你的数据库提供程序支持,就可只使用一个适配器,并用一个批处理查询来装载数据:
SqlDataAdapter sda = new SqlDataAdapter(
“SELECT * FROM Customers;” + “SELECT * FROM Products;”);
sda.Fill(ds);
然而,表的默认命名问题再度出现。为了一劳永逸地解决这个问题,可为适配器定义新的TableMapping属性:
sda.TableMappings.add(“Table”,”Customers”);
sda.TableMappings.add(“Table1”,”Products”);
冰山之一角
DataSet是微软ADO.NET数据访问API的核心,提供了许多强大的功能。本文只介绍了作为DataSet对象一部分提供的少许功能。在以后的文章里,我会更多地探讨这方面的主题。
