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

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

本文导航:

1 DataSet的缺点

1.1 使用DataSet后系统还像N层吗?

一个最简单的例子,通常访问DataSet中的数据是以这样的方式访问的。
ds.Tables(0).Rows(i)("UserID")
这样的语句很可能遍布我们的系统,那么假如我由于某种原因导致数据库构架发生了变化,可能会影响到列名字“UserID”那么这样影响将影响到我们系统的各个层,甚至是U层,这可能是最简单的变化了。数据库的改变牵扯到了系统的各个层,这样的设计将是很危险的。
DataSet的另外一个缺点就是要求开发人员必须了解基础构架。
我们说的不是基础知识,而是关于列名称,类型和关系的所有知识。
Ctype(ds.Tables(0).Rows(i).("UserID")),integer)

这样不仅难于阅读,而且要非常熟悉列名称及其类型。理想情况下我们业务层是不需要知道有关基础数据库、数据库构架或SQL的任何内容。

1.2 弱类型DataSet

DataSet属于弱类型,因此容易出错,还可能影响开发工作。这意味着无论何时从DataSet中检索值,值都以System.Object的形式返回,您需要对这种值进行转换。而你面临的可能是失败的风险。更不幸的是这种错误是在运行时发生的而不是在编译时。
而在处理弱类型时,vs等工具并不能给你太多的帮助,你需要了解构架的知识。


  Dim userId As Integer = CInt(ds.Tables(0).Rows(0)("UserId"))

  Dim userId As Integer = CInt(ds.Tables(0).Rows(0)(0))

这段代码展示了如何从 DataSet 中检索值的方法,这样的代码在运行时都会产生大量错误?

  1. 转换可能由以下原因失败
    • 可能为空
    • 开发人员可能对数据类型判断有误。
    • 如果您使用序列号,谁知道这个序列号代表什么。
  2. ds.Tables(0) 可能返回一个空索引。
  3. “UserId”可能由于以下原因而不是一个无效的列名:
    • 可能已经更改了名称。
    • 可能不是由存储过程返回的。
    • 可能包含错别字。

我们可以修改代码并以更安全的方式编写,即为 null/nothing 添加检查,为转换添加 try/catch。但是效果并不是那么好。弱类型的DataSet将错误从设计时或者编译时转移到了运行时,显然这是有着很大风险的。
要想解决上边的DataSet的两个问题,有一种解决方案,就是创建自定义实体类和自定义实体集合( 自定义实体类简介)。对于弱类型的DataSet的缺点可以通过强类型的DataSet来弥补。

2 强类型的DataSet

而一个强类型的DataSet,则是Visual Studio基于数 据库schema为你生成的一个类,其成员的类型都是由这个schema决定的。强类型的DataSet本身,是由继承 于ADO.NET中DataSet,DataTable,和DataRow类的子类组成的。除了强类型的DataTable外,强类型的DataSet现在还包括TableAdapter类,这些类包含了填充DataSet中的DataTable和把 DataTable的改动传回数据库的各种方法。

2.1 如何生成强类型DataSet
  • 项目-添加新项-从弹出窗口中选择数据-选择数据集,起个名字,确定。就会弹出设计视图了。
  • 下一步要做的就是打开服务器资源管理器,然后找到要创建到数据集里的数据表,把它拖到设计视图中,最后shift+ctrl+b生成,一个typed DataSet就创建完毕了。
2.2 如何访问强类型DataSet属性

强类型的DataSet是从DataSet派生的,它根据事先定义的Data Schema生成数据集,对数据集中的字段实行强类型约束。你可以通过它产生的cs文件看到许多方法对DataTable的操作进行了封装,这样你就可以通过MyDataSet.MyTable.Field对字段进行访问,而不是像DataSet那样: MyDataSet.Tables("TableName")("Field")。

  • TypedDataSet.TypedDataTable[n]. TypedProperty
    • TypedDataSet:强类型数据集,返回强类型的数据集。
    • TypedDataSet.TypedDataTable:强类型数据表,返回强类型的数据表
    • TypedDataTable[n]:强类型索引,返回强类型数据行
    • TypedProperty:强类型列属性。列的强类型访问,返回列类型的实例。
  • DataSet. Tables[n]. Rows[m][ DataColumn| int |string columnName]
    • DataSet:返回DataSet。
    • Tables[n]:返回DataTable。
    • Rows[m]:返回DataRow。
    • Rows[m][ DataColumn| int |string columnName]:返回Object类型的引用。

强类型类使用了Partial类特性,Partial类允许一个类定义存在于一个项目的多个文件中。使用类允许在项目中的某个单独的文件中为强类型数据集补充代码去实现验证逻辑或商业逻辑。如果重新生成强类型数据集,这个单独文件的代码不会受到影响。关于Partial类请参考

2.3 强类型DataSet与弱类型DataSet对比
  • 性能上的考虑:虽然Typed DataSet创建对象实例的时候比unTypede DataSet要多一些开销(时间和空间),但是在填充数据的时候要比untyped DataSet快,这是因为DataAdapter已经知道怎么Fill一个Typed DataSet,相比之下,DataSet需要两次读取数据库,第一次取得数据库中表的结构信息,第二次才fill数据。
  • Typed DataSet相对于DataSet的缺陷:除了创建的开销之外,Typed DataSet不如DataSet灵活,因为Typed DataSet一旦确定,数据表的结构就固定了,如果需要修改,必须重新生成。
  • 而DataSet你可以随时根据需要进行操作(比如添加字段,删除字段等)。

3 总结

  • 弱类型的DataSet虽然灵活,但是显而易见它的缺点是很多的,强类型在一定方面上弥补了弱类型的DataSet的不足。具体使用还是要看情况。
  • 不管是弱类型的DataSet还是强类型的DataSet都与数据之间保持了一种联系,使得他们能够方便的在关系数据库里操作,但是这就意味着失去了所有面向对象的优点。
  • 有句话说的特别好:
    • “DataSet 是一个对象,对吗?但它并不是域对象,它不是一个‘苹果’或‘桔子’,而是一个‘DataSet’类型的对象。DataSet 是一只碗(它知道支持数据存储)。DataSet 是一个知道如何保存行和列的对象,它非常了解数据库。但是,我不希望返回碗,我希望返回域对象,例如‘苹果’。
  • 对于DataSet的缺点使用自定义实体类和自定义集合可能会是最好的解决方案,但并不是唯一的方案,这个方案也不一定适合你。参考这篇文章
  • 最后推荐大家有空可以多看看MSDN上的技术文章,虽然看起来有些吃力,但是感觉收获还是很大的。

MSDN技术文章
(本篇博客使用VIM的vimwiki插件写的,感觉效果还不错)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值