强类型数据集与弱类型数据集

10

什么是.Net中的强类型数据集?能否用清晰简洁的例子解释一下?

同时,强类型和弱类型数据集有什么区别?


个人而言,我不确定我会在大多数的代码中推荐使用 任何一个;除非你是:a. 从内存中使用SqlBulkCopy,或者b: 编写一个通用查询工具,如SSMS... - Marc Gravell
1
你尝试过查看MSDN上的内容吗?http://msdn.microsoft.com/en-us/library/esbykkzb(v=VS.100).aspx - Marc Gravell
两者都描述了你不应该使用的东西。你应该使用ORM代替 :) - Stilgar
4个回答

9

强类型数据集是基于数据库模式生成的。它们由从DataSet、DataTable和DataRow派生的类组成。数据库列成为TableRow派生类的正确类型属性。

未经类型化的数据集简单地意味着直接使用数据集,而不是使用后代。所有列访问都必须进行类型转换。

没有弱类型数据集这样的东西。


8

有类型数据集与无类型数据集

一个有类型的数据集是从基本的DataSet类派生而来,并使用存储在.xsd文件中的Dataset Designer中的信息生成一个新的强类型数据集类。模式(表、列等)的信息被生成并编译成这个新数据集类的一组一流的对象和属性。因为有类型的数据集继承了基本的DataSet类,所以有类型的类具备了DataSet类的所有功能,并且可以用作需要一个DataSet类实例作为参数的方法。

相比之下,无类型的数据集没有对应的内置模式。与有类型数据集一样,无类型数据集包含表、列等 - 但这些仅作为集合公开。(但是,在手动创建表和其他数据元素后,您可以使用数据集的WriteXmlSchema方法将数据集的结构导出为模式。)

有类型和无类型数据集的数据访问对比

有类型数据集的类具有一个对象模型,其中其属性采用表和列的实际名称。例如,如果您正在使用有类型的数据集,则可以使用以下代码引用列:

C#VBCopy

// This accesses the CustomerID column in the first row of the Customers table.
string customerIDValue = northwindDataSet.Customers[0].CustomerID;

J#Copy

// This accesses the CustomerID column in the first row of the Customers table.
String customerIDValue =
    northwindDataSet.get_Customers().get_Item(0).get_CustomerID();

相比之下,如果你正在处理一个未经类型定义的数据集,相应的代码如下:

C#VBCopy

 string customerIDValue = (string)
    dataset1.Tables["Customers"].Rows[0]["CustomerID"];

J#Copy

 String customerIDValue = (String)
    dataset1.get_Tables().get_Item("Customers").get_Rows().get_Item(0).get_Item("CustomerID");

类型化访问不仅更易于阅读,而且在 Visual Studio Code 编辑器中完全受 IntelliSense 支持。除了更容易使用外,类型化数据集的语法还提供了编译时的类型检查,大大降低了将值分配给数据集成员时出错的可能性。如果您更改了 DataSet 中的列名称,然后编译应用程序,您会收到一个构建错误。通过在任务列表中双击构建错误,您可以直接转到引用旧列名称的代码行或行。与非类型化数据集相比,类型化数据集对表和列的访问也稍微快一些,因为访问是在编译时确定的,而不是通过运行时集合确定的。
尽管类型化数据集具有许多优点,但在许多情况下,非类型化数据集也很有用。最明显的情况是数据集没有可用的模式。例如,如果您的应用程序正在与返回数据集的组件交互,但您事先不知道其结构,则可能会发生这种情况。同样,当您处理没有静态、可预测结构的数据时,有时使用类型化数据集是不切实际的,因为每次更改数据结构时都必须重新生成类型化数据集类。
更普遍地说,有许多时候您可能会动态创建数据集而没有可用的模式。在这种情况下,数据集只是一个方便的结构,您可以在其中保存信息,只要数据可以以关系方式表示。同时,您可以利用数据集的功能,例如将信息序列化以传递给另一个进程,或编写 XML 文件。

3
我猜区别如下:
强类型数据集是指在或之前数据集被填充时,数据集知道与每个列相关联的类型。
弱类型数据集强制数据集猜测类型。在列可能为null或数字的情况下,数据集可能会错误地猜测期望的类型是字符串而不是可空整数。

一个数据集(有类型或无类型)不需要猜测数据类型。 - H H

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接