现在的位置: 首页 > 综合 > 正文

强类型DataSet的基本知识

2013年01月08日 ⁄ 综合 ⁄ 共 2981字 ⁄ 字号 评论关闭

 “typed DataSet是从DataSet派生的,它根据事先定义的Data Schema生成数据集,对数据集中的字段实行强类型约束。你可以通过它产生的cs文件看到许多方法对DataTable的操作进行了封装,这样你就可以通过MyDataSet.MyTable.Field对字段进行访问,而不是像DataSet那样:
MyDataSet.Tables["TableName"]["Field"]; 简化了编程,同时不容易出错,想象一下如果在"Field"中拼错了字段名,那么编译器也不会检查出来,对于typed DataSet就不用了,如果你Field写错的话,那么马上就可以知道。
还有就是如果你在Typed DataSet包含多数据集,同时在XSD中对这些数据集建立关系和约束,那么Type DataSet会生成相应的方法来反映这些关系和约束。如果使用untyped DataSet,你需要自己做。
性能上的考虑:虽然Typed DataSet创建对象实例的时候比unTypede DataSet要多一些开销(时间和空间),但是在填充数据的时候要比untyped DataSet快,这是因为DataAdapter已经知道怎么Fill一个Typed DataSet,相比之下,DataSet需要两次读取数据库,第一次取得数据库中表的结构信息,第二次才fill数据。
Typed DataSet相对于DataSet的缺陷:除了创建的开销之外,Typed DataSet不如DataSet灵活,因为Typed DataSet一旦确定,数据表的结构就固定了,如果需要修改,必须重新生成。
而DataSet你可以随时根据需要进行操作(比如添加字段,删除字段等)。”

上面一段话的出处不可考:)下面来看怎么用vs.net创建强类型DataSet
项目-添加新项-从弹出窗口中选择数据-选择数据集,然后起一个名字,点确定。现在就可以看到设计视图了。
下一步要做的就是打开服务器资源管理器,然后找到要创建到数据集里的数据表,把它拖到设计视图中,最后shift+ctrl+b生成,一个typed DataSet就创建完毕了。
很简单吧,现在可以看看typed DataSet的后台.cs代码,推荐使用类视图来快速查看该typed DataSet的详细内容。可以看到属性方法事件一应具全,在typed DataSet里包含的原ado.net的datatable/datarow/datacolumn都是以套嵌类的方式公开的,数据库里的字段以属性方式公开
http://bbs.blueidea.com/forum.php?mod=viewthread&tid=1723109

 

访问Typed DataSet的性能比untyped Dataset高

在网上看到了不少这样评论,访问Typed DataSet数据的性能比untyped Dataset高。我一直表示怀疑,毕竟两者都是基于DataSet的实现;前者是代码编写时确定结构后者在运行期确定。按道理两者实例化后操作的效率是一致。

但从http://rottenapple.cnblogs.com/上的测试结果看到,就算用Index访问untyped Dataset 的DataRow字段值也比不上Typed DataSet快!难道还有什么比索引定位还快?于是我就看下Typed DataSet在访问成员值是如何定义的。

代码如下:

public int CategoryID

{

              get {

                   return ((int)(this[this.tableCategories.CategoryIDColumn]));

              }

              set {

                  this[this.tableCategories.CategoryIDColumn] = value;

              }

    }

原来DataRow除了提供Key和Index来定位成员外还提供了DataColumn定位的方法。为什么通过DataColumn来定位比Index要快呢?为了找到这个原因只能用反编译工作看下DataRow的代码了。

反编译看到以下代码终于就明白了。

public object this[int columnIndex]

{

     get

      {

        return [Table.Columns[columnIndex]];

      }

 

      set

      {

        [Table.Columns[columnIndex]] = value;

      }

}

无论你是通过Key还是Index定位,最终都是通过DataColumn来定位最终访问者。实际上Typed DataSet还是untyped Dataset访问效率应该都是一样的,只是访问方式不同导致效率上有差别。

开发人员可以通过写Typed DataSet重新包装来规定数据的访问方式,对于untyped Dataset就没有这么方便的,因为是运行期确定为了方便使用和维护很多时候只能用Key来访问。Typed DataSet虽然提高了访问效率(个人认为只是很微小的提升),但同时带来的就是Typed DataSet的维护工作。

如果真的要求效率为什么不直接用DataReader呢?而我自己偏向采用的方法是DataReader->Entity,以上纯属个人见解。

 

-------------------------------------------------

其次,世界上没有事情是绝对的,就编程这方面,代码执行速度,执行效率和开发效率、可读性维护性方面,往往没有“绝对追求速度”或者说“绝对易开发性”。 是凡接触过ADO.Net的人都知道,DataReader比DataSet速度快,DataSet比DataReader开发容易,功能强。但是并不是说,因为大家都希望自己程序快一点,所以就都用DataReader,因为我们要做的是在两者之间取得平衡而不是走极端——真要走极端,不要用.Net了,直接用汇编,速度肯定最快!

 

 

 

在一个较大的项目中使用强类型的DataSet的好处有很多,我觉得以下几点值得关注。
一: 提高运行效率。由于在编译的时候就将强类型DataSet的代码进行编译。
二: 提高开发效率。由于强类型的DataSet可以和其它类一样使用属性,方法等。列名,表名都可以利用逗点自动给出。
三:可以在xsd文件中添加codegen:nullValue属性来确保使用强类型的时候不会出现DBNULL的情况。
四:可以设定DataSet的初始值,这样就不需要另外写一个函数去初始化它。经过测试,该方法比写一个初始化方法至少快1倍以上。
但是,微软的代码自动生成工具无法设定某些类型的初始值,例如,日期,Byte等。我的做法是,写一个自动生成工具去添加剩余的。

http://www.cnblogs.com/rottenapple/archive/2006/04/10/371005.html

 

C#中DataSet 可视化设计使用方法

http://blog.sina.com.cn/s/blog_40678c330100awkh.html

抱歉!评论已关闭.