分享

DataSet的说明,以及弱类型化和强类型化DataSet的介绍与流程

 我叫杜胖胖 2018-08-21

什么是DataSet?

它是一个数据集,读取数据。使用中,有强类型数据集和弱类型数据集(标准说法应该是类型化的dataset和非类型化的dataset),前者是生产中常用的方式,因为强类型数据集使用时表名都是自动生成的,避免了字符串内容输入错误带来的调试问题(因为这类问题编译器不会报错),所以推荐使用强类似的dataset,它对数据库的操作是实时的!但是有一次写代码出现了一个情况:创建好adapter和datatable->更新->遍历表,但是数据却发现没有更新,但是结束后右键查看表然后右键重新执行SQL发现写进去了(注:刷新是没用的)这原因很简单,因为被遍历的datatable在更新之前就被取了出来,遍历的是被取出来放在内存中的表,如果把顺序改为:创建好adapter->更新->datatable->遍历表的话就能看到明显的效果。故datatable的遍历操作之前应该就是该表的建立,这样才是真正实时反馈(尽管数据库文件绝对是实时的)。

当然,它也有不足,如果这个数据库要是经常要变换字段的话,每一次变换都要重新生成。

了解DataSet,DataTable和DataRow的关系:

dataset的本质其实就是一个一个的datatable,而datatable的本质其实就是一个一个的datarow。所以有   DataTable table=dataset.Tables[0];//把dataset里的第一个table给table变量;
也有 DataRow row=table.Rows[1];吧table的第2行内容赋值给一个DataRow变量row。所以简而言之,DataSet(数据集,一个数据表集群)>DataTable(数据表,有很多数据行构成)>DataRow

 

而且可以这样想,在建立类型化的dataset时,拖入数据集的是数据库中的某个表,也就是datatable。故对于一个数据集可以看出一个数据库,拖入多少个表里面就有多少个不同的datatable,然后不同的datatable又有各自对应的adapter(配置器)。联想到数据库文件的结构:数据库-数据库中的表-表中的行列,就很容易明白这种结构的建立方式了。

 

adapter.Fill(dataset)过程是什么意思:

就是将执行将某实例adapter后得到的数据填充到某实例dataset中去。因为adapter执行了sql操作,返回的是表,所以如果想结果放到一个dataset中,就执行这个操作

它的作用?

在用ExecuteDataReader时用到一个SqlDataReader对象设为reader的read()方法来读取数据时可能出现一种情况,就是当SqlConnection关闭的时候数据便无法获得了,这是因为用SqlDataReader读取出来的数据不是放在程序中的,而是放在数据库服务器中的,那么,一旦链接关闭,就没法读取了。

一般来说,如果是简单的程序结构是不会出现的,例如前面的例子,但是在具体的生产中,经常把这些查询方法都封装在一个类中,便于使用,比如说起名为SqlHelper类,然后按照常理来说ExecuteNonQuery()方法返回的是int;ExecuteScalar()返回的是一个object;都是可以的,那么ExecuteReader();就应该返回一个SqlDataReader对象了,但是就会出现上情况,在SqlHelper类中调用玩它就关闭了链接,在主方法中调用就会出错,故必须得使用别的方法来读取数据,即DataSet的作用就是解决了这个问题,它直接去出来放在数据库服务器内存中,链接关闭了也可以访问数据。

执行大批量操作时:

在利用强类型化dataset访问数据库时,vs会自动为用户生成各种操作方法,xxx.Insert(xxx),xxx.Delete(xxx),xxx.Update(xxx);而且,可以通过观察这些方法具体的方法内容,可以发现,都含有一段自动判断是否打开链接的判断,如果没有打开他们会自动打开,如果打开了则会判断语句是否完了,如果语句结束会自动关闭连接,所以我们也没有必要自己去添加adapter.connection.Open和adapter.connection.Close语句(尽管加了也不会出错)。

但是,如果是一次性批量的添加大量的数据时,比如是对某数据库添加10000个数据,如果没一个都在添加时自动去判断是否打开链接的话,势必会对耗费大量的时间。

因此,如果是大的批量操作,一般来说自己写链接的开与关:

adapter.connection.Open();

.....

操作语句

.....

adapter.connection.Close();

这样耗时要少,因为在判断中第一个if语句就直接判断了情况。

DataSet的缺点:

因为DataSet要把数据放在数据库服务器中,势必会占用数据库服务器内存,而SqlDataReader不会。故使用原则是:对于查询数据结果量小的尽量使用DataSet,而对于数据查询结果庞大的还是SqlDataReader为佳(由于刚刚入门,可能还有别的更好的方法)。

1、下面图示是弱类型一般的使用方法流程:

DataSet的说明,以及弱类型化和强类型化DataSet的介绍与流程
 

2、下面图示是类型一般的使用方法流程:

DataSet的说明,以及弱类型化和强类型化DataSet的介绍与流程

注:上图中最后一步的第二种(更新,删除,插入)只是其中的一种模式中的“数据库直接模式”,常用的有两种,还有一种是“批量更新模式”详见:http://msdn.microsoft.com/zh-cn/dd255896 步骤4的内容

通过上面链接资料中的例子,可以知道当在批量更新模式中 xxxxAdapter.update(是dataTable作为参数)这样就对这个dataTable表的数据库中的表进行了实时的更新;

在数据库直接模式中xxxxAdapter.update(是对应需要更新的内容作为参数);如:productsAdapter.Update("Chai", 1, 1, "10 boxes x 20 bags",18.0m, 39, 15, 10, false, 1);这样就和一个update的SQL语句一样。







 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多