黑马程序员技术交流社区

标题: 什么是DataSet强类型呢? [打印本页]

作者: 李朋霏    时间: 2012-7-20 14:19
标题: 什么是DataSet强类型呢?
一般该怎么应用呢?
作者: 黄涛    时间: 2012-7-20 14:33
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你可以随时根据需要进行操作(比如添加字段,删除字段等)。”
作者: 许庭洲    时间: 2012-7-20 14:36
强类型DataSet的应用
1,新建数据集DataSet.xsd;
2,在数据集中可以新建DataSet\DataTable\ DataTable TableAdapters;
3,写类的方法主要是返回DataTable\int等类型。DataTable类型可以进行查询、更新删除操作,主要用于存储过程。如果只是一般SQL语句没有必要用DataTable。
           //实例化数据集,注意不是dataset,他是vs自动生成的。
            aopDataSetTable ds = new aopDataSetTable ();
           //实例化orders表的Adapter类
            OrdersTableAdapter ot = new OrdersTableAdapter();
            //取数据库数据填充入数据集orders表中。
            ot.Fill(ds.Orders);
            //数据集绑定数据网格
            dataGridView1.DataSource = ds.Orders;

作者: 许楠    时间: 2012-7-20 17:52
强类型DataSet,是指需要预先定义对应表的各个字段的属性和取值方式的数据集.对于所有这些属性都需要从DataSet, DataTable, DataRow继承,生成相应的用户自定义类。强类型的一个重要特征,就是开发者可以直接通过操作强类型数据集对象中的域属性来实现对关系数据对象的操作.而不是向非强类型数据集那样,使用结果集进行操作.
作者: 小高    时间: 2012-7-20 17:53
类型化的 DataSet 是从DataSet 派生的类。同样,它继承 DataSet 的所有方法、事件和属性。此外,类型化的 DataSet 提供强类型的方法、事件和属性。这意味着可以按名称(而不是使用基于集合的方法)访问表和列。除了提高代码的可读性之外,类型化的 DataSet 还允许 Visual Studio .NET 代码编辑器自动填写您键入的行(代码智能提示,提高Coding的速度)。
此外,强类型的 DataSet 还允许在编译时对作为正确类型的值进行访问。通过强类型的 DataSet,将在编译代码时(而不是在运行时)捕获类型不匹配错误。
作者: 王超    时间: 2012-7-21 16:29
关于强类型DataSet其实现原理为:
假设我有一个表My_Users(UID,UNAME.UPASSWORD.UMESSAGE)
则一个强类型DataSet类内容类似为:
下面类不完整无法编译通过只是个便于原理的理解,个个成员属性的赋值都应该是从数据库中得到的而不是value;
  1.    class My_UsersDataRow : DataRow
  2.     {
  3.         public int UID
  4.         {
  5.             get
  6.             {
  7.                 return Convert.ToInt32(this["UID"];
  8.             }
  9.             set
  10.             {
  11.                 this["UID"] = value;
  12.             }

  13.         }
  14.         public int UNAME
  15.         {
  16.             get
  17.             {
  18.                 return Convert.ToString(this["UNAME"]);
  19.             }
  20.             set
  21.             {
  22.                 this["UNAME"] = value;
  23.             }

  24.         }
  25.         public int UPASSWORD
  26.         {
  27.             get
  28.             {
  29.                 return Convert.ToString(this["UPASSWORD"]);
  30.             }
  31.             set
  32.             {
  33.                 this["UPASSWORD"] = value;
  34.             }
  35.         }
  36.         public int UMESSAGE
  37.         {
  38.             get
  39.             {
  40.                 return Convert.ToString(this["UMESSAGE"]);
  41.             }
  42.             set
  43.             {
  44.                 this["UMESSAGE"] = value;
  45.             }
  46.         }
  47.     }
复制代码
这样创建一个实例对象My_UsersDataRow datarow =new My_UsersDataRow();
那么就可以直接访问数据库表中对应的字段数据如:datarow.UID;datarow.UNAME;datarow.UPASSWORD;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2