热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

弱类型数据集与强类型数据集本文导航:弱类型数据集与强类型数据集1DataSet的缺点1.1使用DataSet后系统还像N层吗?1.2弱类型DataSet2强类型的DataSet2.1如何生成

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

本文导航:

  • 弱类型数据集与强类型数据集
    • 1 DataSet的缺点
      • 1.1 使用DataSet后系统还像N层吗?
      • 1.2 弱类型DataSet
    • 2 强类型的DataSet
      • 2.1 如何生成强类型DataSet
      • 2.2 如何访问强类型DataSet属性
      • 2.3 强类型DataSet与弱类型DataSet对比
    • 3 总结

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插件写的,感觉效果还不错)


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • java代码利用aspose,java初学者代码
    本文目录一览:1、aspose.cellsjava合并excel ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 概述本章主要写当慢查询文件很大的时候怎样在线生成一个新的慢查询文件。测试环境:mysql5.6.2 ... [详细]
  • Win7激活错误代码0xc004e003怎么解决?
    一般情况下当我们在安装win7系统之后,都是需要进行激活才能够正常使用所有功能,而最近有用户反映说win7激活失败提示错误代码0xc004e003,这是怎么回事?怎么解决呢?为此, ... [详细]
author-avatar
淡忘那曾经的你_953
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有