强类型数据集与弱类型数据集
Posted
技术标签:
【中文标题】强类型数据集与弱类型数据集【英文标题】:Strongly typed datasets vs. weakly typed datasets 【发布时间】:2011-06-22 20:17:20 【问题描述】:.Net 中的强类型数据集是什么意思?任何人都可以用一个清晰而简短的例子来解释吗?
另外,强类型数据集和弱类型数据集有什么区别?
【问题讨论】:
就个人而言,我不确定我是否在大多数代码中推荐 either;除非你是 a:使用内存中的 SqlBulkCopy,或者 b:编写像 SSMS 这样的通用查询工具... 您是否尝试过查看 MSDN 上的内容? msdn.microsoft.com/en-us/library/esbykkzb(v=VS.100).aspx 两者都描述了你不应该使用的东西。你应该改用 ORM :) 【参考方案1】:强类型数据集是基于 Db Schema 生成的。它们由派生自 DataSet、DataTable 和 DataRow 的类组成。 Db 列成为 TableRow 派生类的正确类型属性。
无类型数据集仅仅意味着直接使用数据集,而不是后代。所有列访问都必须进行类型转换。
没有弱类型数据集这样的东西。
【讨论】:
【参考方案2】:类型化数据集与非类型化数据集 类型化数据集是首先从基本 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 文件的能力。
【讨论】:
【参考方案3】:我猜这个区别是这样的:
强类型数据集是指数据集在填充数据集时或之前知道与每列关联的类型。
弱类型数据集迫使数据集猜测类型可能是什么。在列可能为 null 或数字的情况下,数据集可能会错误地猜测预期类型是字符串而不是可为空的 int。
【讨论】:
数据集(有类型或无类型)不必猜测数据类型。【参考方案4】:这里还有一个简单的解释:http://allthingscs.blogspot.com/2011/03/weakly-typed-vs-strongly-typed-objects.html
【讨论】:
以上是关于强类型数据集与弱类型数据集的主要内容,如果未能解决你的问题,请参考以下文章