类型化数据集与非类型化数据集
类型化数据集是首先从基本 DataSet 类派生的数据集,然后使用来自数据集设计器的信息(存储在 .xsd 文件中)生成新的强类型化数据集类。来自模式(表、列等)的信息被生成并编译到这个新的数据集类中,作为一组一流的对象和属性。因为类型化数据集继承自 DataSet 基类,所以类型化类承担了 DataSet 类的所有功能,并且可以与将 DataSet 类的实例作为参数的方法一起使用
相比之下,无类型数据集没有相应的内置架构。与类型化数据集一样,非类型化数据集包含表、列等——但这些仅作为集合公开。 (但是,在无类型数据集中手动创建表和其他数据元素后,您可以使用数据集的 WriteXmlSchema 方法将数据集的结构导出为模式。)
类型化和非类型化数据集中的对比数据访问
类型化数据集的类具有对象模型,其中其属性采用表和列的实际名称。例如,如果您正在使用类型化数据集,则可以使用如下代码引用列:
C#VB复制
// This accesses the CustomerID column in the first row of the Customers table.
string customerIDValue = northwindDataSet.Customers[0].CustomerID;
J#复制
// This accesses the CustomerID column in the first row of the Customers table.
String customerIDValue =
northwindDataSet.get_Customers().get_Item(0).get_CustomerID();
相比之下,如果您使用的是无类型数据集,则等效代码为:
C#VB复制
string customerIDValue = (string)
dataset1.Tables["Customers"].Rows[0]["CustomerID"];
J#复制
String customerIDValue = (String)
dataset1.get_Tables().get_Item("Customers").get_Rows().get_Item(0).get_Item("CustomerID");
类型化访问不仅更易于阅读,而且在 Visual Studio 代码编辑器中得到 IntelliSense 的完全支持。除了更易于使用之外,类型化数据集的语法在编译时提供了类型检查,从而大大降低了将值分配给数据集成员时出错的可能性。如果更改 DataSet 中列的名称,然后编译应用程序,则会收到生成错误。通过双击任务列表中的构建错误,您可以直接转到引用旧列名称的代码行。在运行时访问类型化数据集中的表和列也稍快一些,因为访问是在编译时确定的,而不是在运行时通过集合确定的。
尽管类型化数据集有很多优点,但在多种情况下,非类型化数据集还是有用的。最明显的情况是数据集没有可用的模式。例如,如果您的应用程序正在与返回数据集的组件交互,但您事先不知道其结构是什么,则可能会发生这种情况。同样,有时您处理的数据没有静态的、可预测的结构;在这种情况下,使用类型化数据集是不切实际的,因为您必须随着数据结构的每次更改重新生成类型化数据集类。
更一般地说,很多时候您可能会在没有可用架构的情况下动态创建数据集。在这种情况下,数据集只是一种方便的结构,您可以在其中保存信息,只要数据可以以关系方式表示即可。同时,您可以利用数据集的功能,例如将信息序列化以传递给另一个进程或写出 XML 文件的能力。